2016-10-17 16 views
1

私はリモートマシンをPythonで再起動します。再起動すると、現在のsshセッションが終了します。要求は返されません。私は帰りに興味がありません。リモートコマンドがPythonを返さない

os.command(「sshpass -pパスワードのsshユーザー@ホストの再起動」)

コードは、再起動を実行している、しかし、現在のセッションが死亡、スクリプトが返すことはありません。

私は非同期を行うことができ、スレッド、他の簡単なオプションを無視することができますか?

+0

afaik、 'os.command'はありません。あなたは実際に 'os.system'を使用していますか?代わりに 'subprocess.check_call'を試しましたか? – Evert

+0

あなたは何が起こると思いますか? 「要求は返されません」とはどういう意味ですか? – Tolli

答えて

1

私はスクリプトが返されないことに驚いています。再接続する前にリモートから接続をリセットする必要があります。プロセスのasycを実行することができます。問題の1つは、親プロセスでクリーンアップされていないサブプロセスがゾンビになるということです(まだプロセステーブルの領域を占有しています)。タイマーを追加すると、スクリプトに汚れた作業をしてからバックグラウンドでクリーンアップする時間を与えることができます。

私はこのコマンドをパラメータリストに切り替えて、shell=Trueの設定をスキップしたことに注意してください。中間シェルプロセスが実行されないことを意味します。

import sys 
import subprocess as subp 
import threading 
import timing 

def kill_process(proc): 
    # kill process if alive 
    if proc.poll() is None: 
     proc.kill() 
     time.sleep(.1) 
     if proc.poll() is None: 
      sys.stderr.write("Proc won't die\n") 
      return 
    # clean up dead process 
    proc.wait() 

proc = subp.Popen(['sshpass', '-p', password, 'ssh', '[email protected]', 'reboot') 
threading.Timer(5, kill_process, args=(proc,)) 

# continue on your busy day... 
関連する問題