paramiko を使用して、Python 2.7 で小さな自動化ソフトウェアを作成しています。実行中にリモート マシン (ssh サーバー) が停止し、paramiko クライアントがそれを認識せず、recv_exit_status() メソッドでハングする可能性があります。チャネルまたはトランスポートにタイムアウトを設定しても、何も起こりません。transport.set_keepalive() も役に立ちませんでした。
channel = transport.open_session()
channel.exec_command(cmd)
exit_code = channel.recv_exit_status()
別のアプローチも良いと思いました:
transport.set_keepalive(1)
channel = transport.open_session()
channel.exec_command(cmd)
while not channel.exit_status_ready():
time.sleep(1)
print "waiting", str(transport.is_active())
exit_code = channel.recv_exit_status()
しかし、is_active() は常に True を返し、30 分経っても False に変わることはありません... 私の SW はスレッド化されているため、これが発生すると、スレッドはブロッキング メソッド recv_exit_status() で永久にハングし、ゾンビになります。それを許すことはできません(主にプロの観点から)。また、アクティブポーリングは一般的に悪いプログラミング手法であることは知っていますが、とにかく試してみました...助けてくれてありがとう