什么时候HUP停止发送,我该怎么办呢?

Gar*_*hop 9 linux bash shell signals

回到我年轻的时候,Unix是新事物,创建一个在你退出时没有被杀的过程是一个挑战.我们使用nohup命令来保护我们的持久进程免受HUP信号的影响.如果我们不小心,我们的进程会在我们注销时被杀死,甚至关闭我们启动它们的shell.

快进到今天,我发现我很惊讶默认情况恰恰相反.在Ubuntu和Red Hat系统上,我发现我几乎可以在后台放置任何进程,杀死父shell,注销,任何事情都会继续.我看到了与Bash脚本,Python脚本和C程序相同的行为.我从xterm或ssh会话中获得相同的行为.

例如,在xterm或ssh窗口中,键入:

while [ 1 ]; do date; sleep 10; done > /tmp/out &
Run Code Online (Sandbox Code Playgroud)

现在从另一个窗口运行

tail -f /tmp/out
Run Code Online (Sandbox Code Playgroud)

观察它每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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这完全违背了我年轻时的方式.我想我刚才没注意到它改变了吗?那里的历史学家都知道这发生的时间?是否HUP甚至被用于此目的?

如果确实这是事物的当前状态,我的问题是:当用户注销或断开连接时,如何安排流程死亡?

我有一个黑客,需要注意ppid(父母的pid)改变,但肯定有一些比这更优雅的东西.

Jim*_*imB 6

我相信你正在寻找huponexitshell选项.你可以轻松地设置它

$ shopt -s huponexit
Run Code Online (Sandbox Code Playgroud)

来自bash手册页的一些细节:

收到SIGHUP后,shell默认退出.在退出之前,交互式shell会将SIGHUP重新发送到所有正在运行或已停止的作业.停止的作业被发送SIGCONT以确保他们收到SIGHUP.为防止shell将信号发送到特定作业,应使用disown builtin将其从jobs表中删除(请参阅下面的SHELL BUILTIN命令)或使用disown -h标记为不接收SIGHUP.

如果已使用shopt设置了huponexit shell选项,则当交互式登录shell退出时,bash会向所有作业发送SIGHUP.