Gnu-Screen
為什麼應用程序不能立即從 SCREEN 執行?
假設我們需要在其中執行應用程序並在退出
screen
時保持其執行。screen
以下命令完成了這項工作,但前提sleep 1
是附加了“”。為什麼沒有“”就不行sleep 1
?screen -d -m -L sh -c 'DISPLAY=:0 nohup zenity --info --text test >/dev/null 2>/dev/null &'
這似乎是一個時間問題,因為
nohup
在父母之一發出信號之前沒有足夠的時間來禁用信號。您可以通過strace -o /tmp/s -ff
在命令前面添加screen
然後在/tmp/s.*
您看到的日誌文件之一中看到這一點... access("/bin/nohup", X_OK) = 0 stat("/bin/nohup", {st_mode=S_IFREG|0755, st_size=36696, ...}) = 0 --- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} --- +++ killed by SIGHUP +++
您可以簡化啟動。這對我有用,不需要
&
.DISPLAY=:0 screen -d -m -L nohup zenity --info --text test
另一個解決方案似乎是要求父 shell 使用作業控制。這似乎使它要麼禁用 SIGHUP 到後台,要麼等待孩子
nohup
在退出之前繼續前進。在原始命令上使用sh -cm
而不是sh -c
應該會更好。例如,這對我有用screen -d -m -L sh -cm 'nohup zenity --info --text test >&/dev/null & echo'
而這個
-c
版本沒有。bash
如果使用作業控制,則有一個disown
命令可以保護後台作業免受 SIGHUP 影響,但即使沒有它,您似乎也不需要它,nohup
因為它也可以執行,而不會使screen
程序執行:screen -d -m -L sh -cm 'zenity --info --text test >&/dev/null </dev/null & echo'