Gnu-Screen

為什麼應用程序不能立即從 SCREEN 執行?

  • September 18, 2018

假設我們需要在其中執行應用程序並在退出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'

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