假设我们需要运行应用程序并在退出screen
时保持运行。screen
以下命令完成这项工作,但前提sleep 1
是附加了“”。为什么没有“”它不起作用sleep 1
?
screen -d -m -L sh -c 'DISPLAY=:0 nohup zenity --info --text test >/dev/null 2>/dev/null &'
假设我们需要运行应用程序并在退出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.*
查看您可以简化启动。这对我有用,不需要
&
.另一个解决方案似乎是要求父 shell 使用作业控制。这似乎使它要么禁用 SIGHUP 到后台,要么等待孩子
nohup
在退出之前继续前进。在您的原始命令上使用sh -cm
instead of应该效果更好。sh -c
例如,这对我有用而
-c
版本没有。bash
如果使用作业控制,有一个disown
保护后台作业免受 SIGHUP 影响的命令,但即使没有它,你似乎也不需要它,nohup
因为它也可以工作,不会让screen
进程运行:使用
nohup
as 包罗万象的命令是不可能的,因为它不允许在nohup.out
不抑制所有输出的情况下删除,并且使用nohup.out
instead ofscreenlog.0
是不可能的,因为nohup.out
它不保留回车符。不要使用
nohup
,而是使用 shell 的trap
. 因此,OP 中的命令变为: