为什么在 rc.local 中使用 nohup 运行的进程会被杀死?

为什么在 rc.local 中使用 nohup 运行的进程会被杀死?

我下面有以下脚本树莓派杰西:

文件test.sh包含:

#!/bin/sh -e
nohup sleep 321 &
sleep 120
false
exit 0

当在终端会话中以普通用户身份运行时,我遇到以下情况:

pi@raspberrypi:~ $ ps -ejf |grep sleep
pi        5073  5072  5072  4618  0 15:16 pts/1    00:00:00 sleep 321
pi        5074  5072  5072  4618  0 15:16 pts/1    00:00:00 sleep 120

脚本退出后,sleep 321进程将重新设置父级并仍按预期运行。

pi@raspberrypi:~ $ ps -ejf |grep sleep
pi        5073     1  5072  4618  0 15:16 pts/1    00:00:00 sleep 321

为什么这在 中不起作用rc.local?运行的命令nohup刚刚被杀死。

pi@raspberrypi:~ $ ps -ejf |grep sleep
root       450   449   449   449  0 15:45 ?        00:00:00 sleep 321
root       451   449   449   449  0 15:45 ?        00:00:00 sleep 120

120 秒后,该sleep 321过程就消失了。

rc.local它仅在我替换false为时才起作用false || true,所以我的猜测是,它与运行脚本有关,但为什么从终端-e运行和在启动时运行之间存在差异?test.shrc.local

答案1

因为nohup只允许SIGHUP忽略。但UNIX进程中也有“会话”的概念;守护进程的典型方法比仅仅忽略 SIGHUP 的时间要长一些。

作为吉恩·帕夫洛夫斯基在他的建议中评论: “看一眼daemonize。除了一个很好的工具之外,它对守护进程是什么也有很好的解释。”

——你确实应该这样做。

相关内容