我从一个声称正在跑步的用户那里得到了一个答案
foo 2>&1 >& output.log &
foo
即使他们注销也将导致继续运行。根据该用户的说法,这甚至可以通过SSH连接工作。
我真的不相信,因为我的印象是,在断开与SSH的连接或终止TTY的情况下,shell及其进程将收到SIGHUP,从而导致它们终止。这一点,我的假设下,被使用的唯一理由nohup
在这样的情况下,或者tmux
,screen
等。
然后,我查看了glibc的手册:
该信号还用于向与该会话相关联的作业报告终端上控制过程的终止;该终止有效地断开了会话中的所有进程与控制终端的连接。
这似乎证实了我的想法。但进一步看,它说:
如果进程是具有控制终端的会话领导者,则将SIGHUP信号发送到前台作业中的每个进程,并且将控制终端与该会话解除关联。
那么,这是否意味着放在后台的作业将不会收到SIGHUP?
令我进一步困惑的是,当Zsh警告我我正在运行作业时,我进行了一个交互式Zsh会话,yes >& /dev/null &
并键入exit
,然后再次键入后exit
,告诉我说它已经完成了一项工作。在Bash中执行完全相同的操作会使工作继续进行……
logout
并yes
仍在运行。