我有一个使用 启动另一个应用程序的脚本nohup my_app &
,但是当初始脚本终止时,启动的进程也会停止。根据我的理解,因为它已经运行,nohup
所以不应该发生这种情况。原始脚本也使用 nohup 调用。
那里出了什么问题?
nohup 并不意味着当(父)进程被杀死时(子)进程仍在运行。当您通过 ssh 连接到服务器并在那里启动进程时,使用 nohup 。如果您注销,进程将终止(注销向进程发送信号 SIGHUP 导致进程终止),使用 nohup 避免此行为,并且您在注销时进程仍在运行。
如果您需要一个在后台运行的程序,即使它的父进程已终止,请尝试使用守护进程。
一个非常可靠的脚本已经成功使用了多年,并且在调用 nohup 后总是终止使用这个结构:
nohup ${BinDir}/${Watcher} >${DataDir}/${Watcher}.nohup.out 2>&1 &
也许问题是没有管理输出?
这取决于做什么my-app
- 它可能会设置自己的信号掩码。您可能知道nohup
忽略挂机信号 SIGHUP,而这是由目标程序继承的。如果该目标程序进行自己的信号处理,那么它可能会将 SIGHUP 设置为,例如 SIG_DFT - 默认操作(即死亡)。
要检查,运行strace -f -o out
或truss -f -o out
命令。这将为您提供名为“out”的文件中的所有内核调用。如果是,您应该能够发现正在更改的信号掩码。