web-dev-qa-db-ja.com

Python)を介してリモートマシンでタスクが完了するまで待ちます

Ubuntuのpythonでプログラムを書いています。そのプログラムでは、ネットワークに接続されたリモートマシン(RaspberryPi)で「ファイルの削除」タスクを完了した後にメッセージを印刷しようとしています。

しかし実際には、printコマンドはリモートマシンでタスクが完了するまで待機していません。

誰かが私にそれを行う方法を教えてもらえますか?私のコーディングは以下のとおりです

import paramiko

# Connection with remote machine
client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.2.34', username='pi', password='raspberry')

filename   = 'fahad.txt'
filedelete ='rm ' + filename
stdin, stdout, stderr = client.exec_command(filedelete)
print ("File Deleted")
client.close()
10
Irfan Ghaffar7

これは確かに paramiko SSH exec_command(シェルスクリプト)が完了する前に返される の複製ですが、そこにある答えはそれほど詳細ではありません。そう...

お気づきのとおり、exec_commandノンブロッキング呼び出しです。したがって、次のいずれかを使用して、リモートコマンドの完了を待つ必要があります。

  • Channel.exit_status_ready コマンド補完の非ブロッキングチェックが必要な場合(つまり、プーリング)
  • Channel.recv_exit_status コマンドが完了するまでブロックする場合(および終了ステータスを取得する場合—終了ステータス0は正常な完了を意味します)。

あなたの特定のケースでは、あなたは後で必要です:

stdin, stdout, stderr = client.exec_command(filedelete)  # Non-blocking call
exit_status = stdout.channel.recv_exit_status()          # Blocking call
if exit_status == 0:
    print ("File Deleted")
else:
    print("Error", exit_status)
client.close()
29
Sylvain Leroux

Sylvian Lerouxが提案することを行うことに加えて:

コマンドに、paramikoがsshセッションを閉じた後も実行を継続する必要があるbashスクリプトの実行が含まれる場合(コマンドを送信するたびにこれが発生します)、次を使用します。

Nohup ./my_bash_script.sh >/dev/null 2>&1

Nohupは、sshセッションが閉じられたときに受信した「ハングアップ」シグナルをこのプロセスが無視する必要があることをシステムに通知します。

>/dev/null 2>&1は出力をリダイレクトします。状況によっては、出力が受信されるまで制御がpythonスクリプトに戻されないため、これが必要です。

「stress」や「vlc」などのコマンドラインアプリケーションを実行し、戻った後も実行し続けるために、私が見つけた唯一の解決策は、コマンドをbashスクリプトに入れてから&または&>/dev/nullを続けることです。前の段落で述べた方法を使用して、paramikoでそのbashスクリプトを呼び出すよりも。

これは少し「ハッキー」に思えますが、何日も検索した後で見つけた唯一の方法です。

3
hammeramr