nohup 是否尝试安排程序没有控制终端?

nohup 是否尝试安排程序没有控制终端?

吉尔斯

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 外壳。可以看出,没有对会话进行操作或控制终端。

相关内容