HTTPリクエストを処理するアプリケーションがあり、リクエストを処理するときにリクエストに関する特定の情報をstdout
に出力します。このシナリオでは、バックグラウンド処理を行った後、プロセスでdisown -h
とdisown
を実行しました。それはまだstdout
に出力し続けます。さらに、このプロセスはSSHセッション内で開始されます。私が不安定なインターネットアクセスを持っていて、上記のすべてを実行した後、SSHがこれが発生したことを認識せずに、接続が中断されたと仮定します。当然、SSHが実際に接続が中断されたことを認識するまでには、少し時間がかかります。
この間、SSHセッションが実際に終了するまで、アプリケーションはリクエストの処理時にタイムアウトを経験し始めます。これは、PTYが存在しなくなったときにstdout
への書き込みに関連するバッファリングの問題が原因ですか?
disown
は、SSHが終了したときにアプリケーションがSIGHUP
シグナルを受信しないようにします。ただし、その後、アプリケーションが取り消されたptyに書き込む場合、アプリケーションはSIGPIPE
シグナルを受信します。 SIGPIPE
を処理または無視しない限り、デフォルトでアプリケーションが強制終了されます。
アプリケーションがSIGPIPE
を処理する場合、書き込みを試みるとエラーステータスが返され、エラーを無視するか、中止するか、その他のことを行うかはアプリケーション次第です。 (エラーを無視することはめったに賢明ではありません。)
アプリケーションが停止しないようにする最も簡単な方法が必要で、ファイルにリダイレクトしたくない場合は、screen
またはtmux
内で実行するか、mosh
の代わりにssh
を使用することを検討してください。