web-dev-qa-db-ja.com

SSHセッションが失われた場合、stdoutへのSSH書き込みを介した所有権のないプロセスの動作は何ですか?

HTTPリクエストを処理するアプリケーションがあり、リクエストを処理するときにリクエストに関する特定の情報をstdoutに出力します。このシナリオでは、バックグラウンド処理を行った後、プロセスでdisown -hdisownを実行しました。それはまだstdoutに出力し続けます。さらに、このプロセスはSSHセッション内で開始されます。私が不安定なインターネットアクセスを持っていて、上記のすべてを実行した後、SSHがこれが発生したことを認識せずに、接続が中断されたと仮定します。当然、SSHが実際に接続が中断されたことを認識するまでには、少し時間がかかります。

この間、SSHセッションが実際に終了するまで、アプリケーションはリクエストの処理時にタイムアウトを経験し始めます。これは、PTYが存在しなくなったときにstdoutへの書き込みに関連するバッファリングの問題が原因ですか?

2
drheart

disownは、SSHが終了したときにアプリケーションがSIGHUPシグナルを受信しないようにします。ただし、その後、アプリケーションが取り消されたptyに書き込む場合、アプリケーションはSIGPIPEシグナルを受信します。 SIGPIPEを処理または無視しない限り、デフォルトでアプリケーションが強制終了されます。

アプリケーションがSIGPIPEを処理する場合、書き込みを試みるとエラーステータスが返され、エラーを無視するか、中止するか、その他のことを行うかはアプリケーション次第です。 (エラーを無視することはめったに賢明ではありません。)

アプリケーションが停止しないようにする最も簡単な方法が必要で、ファイルにリダイレクトしたくない場合は、screenまたはtmux内で実行するか、moshの代わりにsshを使用することを検討してください。

3
user3188445