之间有什么区别
$ nohup foo
Run Code Online (Sandbox Code Playgroud)
和
$ foo &
Run Code Online (Sandbox Code Playgroud)
和
$ foo &
$ disown
Run Code Online (Sandbox Code Playgroud) 发出关闭命令后,有时会收到如下状态消息:
Run Code Online (Sandbox Code Playgroud)A stop job is running for Session 1 of user xy
然后系统挂起一段时间,或永远取决于 ???
那么究竟什么是“停工”呢?
另外,为什么它有时会非常准确地估计所需的时间,而有时它可以永远运行?
吉尔斯说
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
Run Code Online (Sandbox Code Playgroud)
ed进程nohup仍然具有与调用 shell 相同的 tty: /dev/pts/5。所以我想知道Gilles所说的“nohup还尝试安排程序没有控制终端,这样当终端关闭时内核不会向它发送SIGHUP”是什么意思?
如果他说的是真的,如何nohup通过Linux API或系统调用函数实现将程序与控制终端分离?
谢谢。