
我正在螢幕會話中運行程序,如果程序崩潰,它會自行重新啟動,但是當程序崩潰時,螢幕會話將終止。
我希望螢幕會話保持開啟狀態,以便程式可以自行重新啟動。有什麼辦法可以做到這一點嗎?
我正在運行 Linux Debian 7 Wheezy
答案1
問題是,程式崩潰有多奇怪?我首先想到的兩件事:
- 這個程式在最後一口氣時發出一些奇怪的控制序列,這些序列
screen
也會讓你崩潰/終止/認為最好不要讓你看到這個。 - 程式向其父進程(
screen
或可能是中間進程)發送訊號殼) 終止它們。
我會嘗試的後續步驟:
- 終止的精確度如何
screen
?它會殺死整個screen
進程還是只殺死它自己的視窗(並行運行的螢幕命令是否仍然存在,螢幕會話是否會分離)? - 如果您從 shell 運行該程序,您可以捕捉訊號來自使用的程式陷阱?
screen
如果您重定向它是否仍然終止標準輸出和標準錯誤到一個文件(如果它不再崩潰,該文件包含什麼 - 我很好奇)。也許您仍然可以使用 來觀看程式運行tail -f
。- 好的,規避不會提供有趣的見解,但是使用
tmux
代替時是否有相同的問題screen
?
編輯1(廣告1):崩潰的程式可以直接從螢幕運行,例如
screen /usr/local/bin/your/crashing/program
或在中間使用 shell 進程(例如,使用您最喜歡的 shell 啟動螢幕窗口,然後運行該程序,例如
screen
/usr/local/bin/your/crashing/program
或者有一個 shell 腳本可以用類似的方法重生
bash -c 'while true ; do /usr/local/bin/your/crashing/program ; done'
pstree
您可以從涉及哪些進程的輸出中看出:
xterm(309)---bash(311)---screen(230)---screen(231)---bash(234)-+-less(323)
`-pstree(322)
就我而言,我有一個從(309)視窗中的(311 screen
)開始的(230和231)以及另一個(234),我從中運行(322和323)。bash
xterm
bash
pstree | less
如果子進程終止,則螢幕終止。這是正常行為,而不是崩潰。因此,如果您的程式直接在 screen 中啟動並崩潰,那麼 screen 也會終止。如果您在 shell 中手動啟動程序,則該 shell 應在程式崩潰後再次顯示提示符號。如果在這種情況下螢幕視窗關閉,則確實有些奇怪。
了解一些迂迴的知識會很有幫助,例如如何啟動和重生程序。