
これは私が遭遇した奇妙な状況です。私たちはオフサイト(または私が働いている場所から離れた場所)にテスト サーバーを持っています。サーバーにアクセスするには、そのネットワークに VPN で接続する必要があります。
長時間実行されるプロセスを実行するために screen を実行しました。プロセスを開始した後、screen の実行可能性を確認するために次の操作を実行しました。
- 私はセッションから離脱した
- PIDを確認するためにscreen -lsを実行した
- ps -ef | grep 画面
- スクリーン -r PID
これらのコマンドを実行し、セッションに再度接続/切断すると、screen セッションがあることが確認できました。
奇妙なのは、次の日に戻ってみると、スクリーン セッションがないことです。確認するために上記のコマンドを実行しましたが、何もありませんでした。ただし、プロセスはまだ実行されています。プロセスを実行するために nohup を使用しませんでしたが、幸運なことに、プロセスはセッションで終了しませんでした。
何が起こったのか知っている人はいませんか? なぜスクリーンセッションが失われ、なぜ運良くプロセスが実行され続けたのでしょうか?
何かお教えいただければ幸いです。=)
答え1
SCREEN
画面が実際に実行されていないことを確認するには、代わりに grep を実行する必要があります。
/tmp
一部のシステムには、、、などのファイルを削除する tmp クリーナーがあります。これにより、ソケット ファイルが見つからない場合があります/var/tmp
。セッションの PID を識別できる場合は、ソケット ファイルを書き換えるように指示することができます。その後、再び動作するはずです。/var/run
screen
kill -CHLD <PID>
screen
screen -r
このような状況になっている場合は、screen
ソケットに別のディレクトリを使用するように設定する必要があります。
答え2
これは最近、私と同僚に再び起こりました。同僚は、これが起こった理由として考えられることを提案しました。会社が接続をタイムアウトにしたために画面がダウンしたのだと彼は考えています。
複数の screen セッションが実行されており、それぞれに長時間実行されるジョブがあります (簡単にするために、セッション A と B と呼びます)。セッション A のジョブは早く終了し、そのセッションはプロンプトに戻りました。非アクティブ状態のためタイムアウト期間が経過すると、セッション A からログアウトされました。このとき、セッション B はまだジョブを実行していましたが、親プロセス (この場合は screen) が終了すると、すべてのセッションが失われると考えられます。
セッション B で実行されていたプロセスは、現在、screen の親 (init プロセスまたはプロセス 1) に継承されており、翌朝確認したときにも実行が継続されています。
この仮説は、実験を実行することである程度裏付けられました。これは Centos で実行されました。screen を起動し、2 つのセッションを開きました。1 つのセッションでは、定期的に cmd を実行して維持しました。もう 1 つは無視しました。約 10 分後、screen は終了し、それとともに開いていた両方のセッションも終了しました。