回到我年轻时,Unix还是新鲜事物的时候,创建一个不会在你注销后被终止的进程是一项挑战。我们使用nohup命令来保护我们的持久性进程免受HUP信号的影响。如果我们不小心,我们的进程将在我们注销或甚至关闭启动它们的shell时被终止。
快进到今天,我发现默认情况似乎完全相反。在Ubuntu和Red Hat系统上,我发现我可以将几乎任何进程放在后台,杀死父shell,注销,甚至关掉窗口,它仍然可以继续运行。我在Bash脚本、Python脚本和C程序中看到了相同的行为。我从xterm或ssh会话中也得到了相同的行为。
例如,在xterm或ssh窗口中输入:
while [ 1 ]; do date; sleep 10; done > /tmp/out &
现在从另一个窗口运行
tail -f /tmp/out
每隔10秒钟打印日期,然后使用Ctrl-D关闭原始父shell。仍在运行。退出并重新登录。仍在运行。
发送HUP
信号,它会立即停止。
我可以用Python脚本或C程序展示相同的行为。无论是否睡眠都没有关系。例如,这个丑陋的C程序表现相同:
#include <stdio.h>
void main() {
while(1) {
printf("*\n");
fflush(stdout);
int i, j, k = 0;
for(i=0; i < 10000; i++) {
for(j=0; j < 100000; j++) {
k += i * j;
}
}
}
}
这完全违背了我年轻时候的方式。也许当它改变时我只是没有注意到?有没有历史学家知道这是什么时候发生的?现在还有人使用HUP
吗?
如果确实是当前情况,我的问题是:如何安排一个进程在用户注销或断开连接时自动退出?
我有一个方法,涉及观察ppid
(父进程ID)的变化,但肯定有比那更优雅的方法。