2016-09-05 13 views
0

リモートサーバー上の一部のソフトウェアの自動展開を実行します。とにかく、リモートコマンドの出力は常にブロックされ、決して終了しません。私はリモートサーバーをチェックして、コマンドがまだ実行中であることを確認することができますが、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)にこだわっていませんでした。 timeout0.0に設定されていたため、非ブロックパターンでした。

したがって、プログラムはwhileループを永遠に実行しましたが、リモートプロセスがまだ出力していましたが、channelから何も受信できませんでした。

これは、paramikoまたは不正なリモートサーバーのいずれかが原因である可能性があると想定しています。

私の解決策は、終了信号が受信されていない間に、チャンネルが限られた時間、例えば120秒で何も受信できなかったときに、私のコマンドを再実行することです。

+0

私は1 2 3 4 5でexec_commandを試してください。echo $ i; sleep 1; done ")'とそれがあなたのために働くかどうかを確認してください。 – pynexj

+0

@whjm私は試しました。出力は正しく、ハングしません。 –

答えて

0

stdoutにデータがないか、eolなしの行がある(つまり、shスクリプト内のread文にある)ときに使用されます。 'get_pty = True'を設定してから、stdoutのバイトだけを読み込んでみてください。 SSHClientでexec_commandを直接使用する例を以下に示します。

ssh = paramiko.SSHClient() 
... 
stdin, stdout, stderr = ssh.exec_command("your-command",get_pty=True) 
stdout.flush() 
nbytes = 0 
while (len(stdout.channel.in_buffer)==0): 
    continue 

nbytes=len(stdout.channel.in_buffer) 
print(nbytes) 
stdout.read(nbytes) 
関連する問題