リモートサーバー上の一部のソフトウェアの自動展開を実行します。とにかく、リモートコマンドの出力は常にブロックされ、決して終了しません。私はリモートサーバーをチェックして、コマンドがまだ実行中であることを確認することができますが、stdoutはparamikoブロックによって表示されます。paramikoで長時間実行されるコマンドブロック
私はこの記事からソリューション読みました:LINK
import paramiko
import select
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('host.example.com')
channel = client.get_transport().open_session()
channel.exec_command("packstack --allinone")
while True:
if channel.exit_status_ready():
break
rl, wl, xl = select.select([channel], [], [], 0.0)
if len(rl) > 0:
print channel.recv(1024)
私はスクリプトの停止を強制的にCtrl + C
を使用するたびに、rl, wl, xl = select.select([channel], [], [], 0.0)
で立ち往生しているようです。
参考のため、私もthisのポストを読んでいますが、運は見つかりませんでした。
コードを変更して長時間持続および大出力のコマンドで動作させるにはどうすればよいですか?
今問題が見つかりました。 実際にはrl, wl, xl = select.select([channel], [], [], 0.0)
にこだわっていませんでした。 timeout
は0.0
に設定されていたため、非ブロックパターンでした。
したがって、プログラムはwhile
ループを永遠に実行しましたが、リモートプロセスがまだ出力していましたが、channel
から何も受信できませんでした。
これは、paramikoまたは不正なリモートサーバーのいずれかが原因である可能性があると想定しています。
私の解決策は、終了信号が受信されていない間に、チャンネルが限られた時間、例えば120秒で何も受信できなかったときに、私のコマンドを再実行することです。
私は1 2 3 4 5でexec_commandを試してください。echo $ i; sleep 1; done ")'とそれがあなたのために働くかどうかを確認してください。 – pynexj
@whjm私は試しました。出力は正しく、ハングしません。 –