【发布时间】:2019-11-06 22:24:40
【问题描述】:
我正在尝试自动后台处理进程。
nohup program > /tmp/program.log 2>&1 < /dev/null &
disown
如果我检查进程是否正在运行并在登录时通过“.bashrc”启动它,程序会启动,但在我退出时会死机。
但是如果我在命令行上执行完全相同的命令,当我退出时,程序会继续在后台运行。
我在 bashrc 启动和 cli 启动之间的程序环境中找不到任何区别。 (bashrc 中几乎没有任何内容)。我对这两种情况的程序的理解应该被同等对待。
有什么区别,我怎样才能阻止 bashrc 启动的“守护进程”在 shell 退出时被杀死。
PS:删除 nohup 没有任何区别。当开始登录退出时,我已经看到程序运行然后死于单独的登录。
在有人说什么之前...在 bashrc 中为程序设置后台后添加“拒绝”并没有解决它!
更新: 如果 ssh 登录连接被终止(窗口关闭或连接突然终止),则在 bashrc 中启动的程序继续运行,但这似乎是因为启动它的 bash 也在运行(至少暂时如此)。 仅当您为 bash 键入“exit”或 bash 被终止(即使使用不可捕获的信号 9!)时,背景才会被终止。
程序的 PPID(被 shell 拒绝)为 0,即它的父进程不是 shell 也不是 init 进程!不管如何开始都是这样。
更新 2... 后台程序从 bashrc 启动...
# ps -jA w
PID PGID SID TTY STAT TIME COMMAND
891 891 891 pts/2 Ss+ 0:00 /bin/bash
899 891 891 pts/2 Sl+ 0:00 program
我杀了那个然后从命令行启动它...
891 891 891 pts/2 Ss+ 0:00 /bin/bash
958 955 891 pts/2 Sl 0:00 program
现在当 shell 存在时,程序不会退出。 所以看起来唯一不同的是 PGID 发生了变化。
如何在不同的 PGID 中启动进程?
【问题讨论】:
-
你能用
pstree -gTt命令告诉我们谁拥有谁吗? -
我无法重现这一点:在我的机器上,
program在注销后继续运行,即使从.bashrc开始,如您的示例所示 -
@Mathieu 被取消的后台进程的 PPID 为 0。既不是 init,也不是 bash。 bash 如何被杀死并不重要,当它死亡时,后台进程也会死亡。