螢幕會話被終止,但進程仍然存在並運行

螢幕會話被終止,但進程仍然存在並運行

這是我遇到過的一個奇怪的情況。我們在場外有一個測試伺服器(或在我工作的地方場外)。要存取伺服器,我需要透過 VPN 連接到其網路。

我運行 screen 來執行一個長時間運行的進程。開始該過程後,我執行了以下操作來檢查螢幕的可行性:

  1. 我退出了會話
  2. 執行 screen -ls 來檢查 PID
  3. ps-ef | grep 螢幕
  4. 螢幕-r PID

運行這些命令並重新附加/分離到會話後,我可以看到有一個螢幕會話。

這是奇怪的部分。我第二天回來,沒有螢幕會議。我運行了上面的命令來檢查,但沒有任何結果。但是,我的進程仍在運行。我沒有使用 nohup 來運行我的進程,但出於某種幸運的原因,我的進程沒有隨會話一起終止。

有誰知道可能發生了什麼事?為什麼我失去了螢幕會話,為什麼我很幸運並讓我的進程繼續運行?

感謝您的任何啟發。 =)

答案1

您可能需要使用 grep forSCREEN來驗證您的螢幕是否確實沒有運作。

某些系統具有 tmp 清理程序,可以刪除/tmp/var/tmp/var/run或類似檔案。這可能會導致screen無法找到其套接字檔案。如果您可以識別會話的 PID,則可以kill -CHLD <PID>告訴screen重寫其套接字檔案。screen -r然後應該再次工作。

如果發生這種情況,您可能應該配置screen為其套接字使用另一個目錄。

答案2

最近,這種情況再次發生在我和我的同事身上,他提出這是發生這種情況的可能原因。他認為由於公司使我們的連線超時,所以螢幕就死掉了。

我們運行了多個螢幕會話,每個會話都有自己的長時間運行作業(為簡單起見,我們稱之為會話 A 和 B)。會話 A 上的作業提前完成,並且該會話返回提示符號。當由於不活動而逾時時,它會將我們從會話A 中註銷。會帶走所有會話。

會話 B 上運行的進程現在由 screen 的父進程(即 init 進程或進程 1)繼承,因此當我們第二天早上檢查時,該進程仍在運行。

這個假設得到了實驗的支持。這是在 Centos 上運行的。我們啟動了 screen 並開啟了兩個會話。在一個會話中,我們定期執行一個命令以使其保持活動狀態。另一個我們忽略了。大約 10 分鐘後,螢幕終止,我們開啟的兩個會話也隨之終止。

相關內容