Gnu-Screen

一旦執行的腳本結束,防止 GNU 螢幕終止會話

  • March 28, 2022

我試圖強制 GNU 螢幕創建一個“虛擬”終端,而不附加到它,在裡面執行腳本並且一旦腳本結束就不會終止會話。

我嘗試了很多組合,包括:

screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh

要麼

screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh

他們都沒有工作。我要麼在沒有執行腳本的情況下獲得會話,腳本就會執行,但會話一旦完成就會終止,或者我收到“未找到螢幕會話”錯誤。

我基本上想要做的是執行 UDP 監聽器,用 PHP 編寫並使其在無限循環中工作(不要中斷監聽)。是的——我可以在最後執行 PHP 腳本&,強制 PHP CLI 作為守護程序執行。問題是,我正在使用一個叫做伺服器的垃圾(QNAP——永遠,永遠不要買這個垃圾!),它似乎忽略了這一點。一旦我註銷 SSH 會話,腳本就會停止。

所以screen似乎是唯一的選擇。但我不明白,為什麼一旦執行命令或腳本結束它就會終止會話?

編輯:我也試過在網際網路上找到的例子:

screen -dmS name
screen -S name -p windowname -X stuff 'mc
'

不缺!附加到它之後(screen -R name)我看到午夜指揮官沒有被處決。儘管範例作者說,它會。

要在腳本完成後保持螢幕繁忙,只需在視窗中保持持久執行。該“某物”的最簡單選擇可能是互動式外殼。這是一種方法(假設bash選擇互動式外殼):

screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
  • -dm:以分離模式啟動螢幕
  • -S:為螢幕設置會話名稱,以便稍後檢索
  • sh -c '...':而不是簡單地執行你的腳本,這將終止,用於sh -c執行多個命令
  • exec bash: 腳本終止後,sh上面的腳本將切換到互動式 shell ( bash),它永遠不會退出,直到外部終止它。screen只要bash實例還活著,它就會保持打開狀態。

引用自:https://unix.stackexchange.com/questions/47271