吉尔斯说
nohup 和 disown 都可以说是抑制 SIGHUP,但是方式不同。 nohup 使程序最初忽略该信号(程序可能会改变这一点)。nohup 还尝试安排程序没有控制终端,这样当终端关闭时内核就不会发送SIGHUP。 disown 纯粹是 shell 内部的;它导致 shell 在终止时不发送 SIGHUP。
$ nohup sleep 100 &
[1] 7882
nohup: ignoring input and appending output to 'nohup.out'
$ get-terminal-info-of-a-process.sh 7882
COMMAND CMD TT PID PPID CGNAME CGROUP PGID TPGID SESS SESSION OWNER
sleep 100 sleep 100 pts/5 7882 6780 systemd:/user.slice/user-10 7:pids:/user.slice/user-100 7882 7885 6780 c2 1000
$ tty
/dev/pts/5
ed进程nohup
仍然具有与调用 shell 相同的 tty: /dev/pts/5
。所以我想知道Gilles所说的“nohup还尝试安排程序没有控制终端,这样当终端关闭时内核不会向它发送SIGHUP”是什么意思?
如果他说的是真的,如何nohup
通过Linux API或系统调用函数实现将程序与控制终端分离?
谢谢。
答案1
正如我,反过来,说,运行的进程nohup
肯定仍然与登录会话和控制终端相关联。毕竟,如果不是这样,体操就没有意义了。忽略控制终端挂起。
nohup
是一个简单的链式加载程序,在链式加载目标程序之前,它会执行两件事:重定向标准输出并忽略挂断信号。
这是nohup
来自 FreeBSD的代码,来自 NetBSD,来自 OpenBSD, 和来自 TENEX C 外壳。可以看出,没有对会话进行操作或控制终端。