だから私はスクリプト(ただしスクリプトです)からsshを介してシステムAからシステムBにコマンドを「指示」し、それをバックグラウンドで送信します。コマンドは次のとおりです。
ssh -T MACHINEB SCRIPT &
マシン A で実行するスクリプトはタイムアウトしません。時々、私はコマンド/スクリプトの指示がマシンBに存在することに気づきましたが(私が要求した場合)、ある種のハングがありました。 psは正しいPIDとPPIDを表示しますが、それはすべてで完了しません。
プロセスが中断される原因が何であるかを見つけようとしています。私の言葉は、これがコードに関連していることをほとんど確信しているということです。次の可能性とあなたが追加できる他のすべてを削除したいと思います。
リモートSSHスクリプトの実行を実行すると、私のプロセスはSSHセッションに接続しますか?もしそうなら、AからBに移動するネットワークまたはSSHの問題がある場合、私のプロセスは影響を受けますか?
ありがとう
ベストアンサー1
ssh -T MACHINEB SCRIPT &
SCRIPTの実行中にSSH接続を実行し続けます。これを行う必要がある理由は次のとおりです。
- SCRIPTが出力を生成すると、SSHはそれをホストに渡す必要があります。
- SCRIPTが入力を読み取ると、SSHはそれをホストから中継する必要があります。これは少し微妙かもしれません。。
- SCRIPT が終了すると、SSH は終了状態をクライアントに送信し、プロセスはその
ssh
状態で終了します。
接続が中断された場合、SCRIPTはstdin、stdout、またはstderrを読み書きしようとしない限り影響を受けません。関連端末がないため、接続が中断されたときにSCRIPTはSIGHUPによって終了しません。ただし、SCRIPTがエラーメッセージを印刷しようとすると、メッセージは接続を介して転送されます。
2つのうちの1つを実行する必要があります。
バッチジョブのアプローチ:SCRIPTが入力を許可せず、標準出力と標準エラーをファイルに書き込むことを確認してください。
ssh -T MACHINEB 'myprogram </dev/null >myprogram.log 2>&1'
対話型方法:スクリーンマルチプレクサ内でSCRIPTを実行します。画面またはマルチプレクサ。
ssh -T MACHINEB screen -S somename -dm myprogram
このスクリーンセッションに接続すると、プログラムが動作している様子を見ることができます。
ssh MACHINEB screen -S somename -dr
プログラムが終了すると、スクリーンセッションも終了します。プログラムの出力とエラーを表示するには、これを維持するには、次を参照してください。実行されたスクリプトが終了したときにGNU画面がセッションを終了するのを防ぐ
また、見ることができますSSH接続から完全に切断されたリモートコマンドの実行