【发布时间】:2014-02-13 04:20:51
【问题描述】:
在我年轻的时候,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 还会被用于此目的吗?
如果这确实是当前的状态,我的问题是:当用户注销或断开连接时,如何安排进程终止?
我有一个 hack,涉及观察 ppid(父 pid)的变化,但肯定有比这更优雅的东西。
【问题讨论】:
-
huponexit 是一个 bash 选项 stackoverflow.com/questions/4298741/…