`disown -h` 和 `nohup` 的工作效率是否相同?

Tim*_*Tim 22 bash nohup disown

disown

  • 导致 shell 在 shell 终止时不向其不承认的作业发送 SIGHUP,并且

  • 从 shell 的作业控制中删除被拒绝的作业。

第一个是第二个的结果吗?换句话说,如果从 shell 启动的进程以任何方式从 shell 的作业控制中删除,当 shell 终止时,shell 是否不会向该进程发送 SIGHUP?

disown -h 仍然使进程处于 shell 的作业控制之下。这是否意味着disown -h使进程仍然接收来自shell发送的SIGHUP,但将进程的SIGHUP动作设置为“忽略”?这听起来类似于nohup.

$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+  Running                 sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+  Stopped                 sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit

$ ps aux | grep sleep
t        26103  0.0  0.0  14584   824 ?        S    15:19   0:00 sleep 123
Run Code Online (Sandbox Code Playgroud)

如果我们忽略它们在使用终端方面的差异,那么做disown -hnohup有效地工作是一样的吗?

谢谢。

Kus*_*nda 23

nohup并且disown -h完全相同

使用disown,从当前交互式 shell 的作业列表中删除进程。jobs在启动后台进程并运行后运行disown不会将该进程显示为 shell 中的作业。一个被取消的作业HUP在退出时不会从 shell收到 a (但请参阅最后的注释)。

使用disown -h,作业不会从作业列表中删除,但HUP如果它退出,shell 不会向它发送信号(但请参阅最后的注释)。

nohup实用程序忽略该HUP信号并启动给定的实用程序。该实用程序继承了信号掩码,nohup因此也将忽略该HUP信号。当 shell 终止时,该进程仍然是 的子进程nohup(并nohup重新成为 的父进程init)。

不同之处在于,无论是谁发送信号,进程都以nohup忽略开始HUP。六亲不认过程只是不发送一个HUP信号,由外壳,但是仍然可以从例如发送信号kill -s HUP <pid>并不会忽略这一点。

请注意,HUP只有在以下情况下才会发送到 shell 的作业

  • shell 是一个登录 shell 并且huponexit设置了shell 选项,或者
  • 外壳本身接收HUP信号。

bash手册中的相关部分(我的重点):

信号

[...]

收到SIGHUP.shell 后默认退出。在退出之前,交互式 shell 将重新发送SIGHUP给所有正在运行或已停止的作业。发送停止的作业SIGCONT以确保它们收到 SIGHUP. 为防止 shell 将信号发送到特定作业,应使用disown内置命令(见SHELL BUILTIN COMMANDS下文)将其从作业表中删除或SIGHUP 使用disown -h.

如果huponexitshell 选项已设置为shopt,则在交互式登录 shell 退出时向所有作业bash发送 a SIGHUP

disown [-ar] [-h] [jobspec ... | pid ... ]

如果没有选项,请jobspec从活动作业表中删除每个选项。[...]如果-h给出选项,每个jobspec不会被删除从表中,但被标记,以便SIGHUP如果shell收到不发送给作业SIGHUP。[...]

有关的:


Mic*_*pec 5

他们是不同的:

  • disown 将从活动作业表中删除该作业。然后继续当前的工作。使用 -h 时,进程不会发送SIGHUP。相反,当它收到 SIGHUP 时,它会与包含它的 shell 一起死亡。

  • nohup 忽略 HUP。然后,进程关闭时本应传递到终端的任何内容都会转入文件nohup.out

    nohup 由 POSIX 定义,而 disown 则不是。

  • “带着包含它的壳一起死去”是什么意思?杀死父进程本身并不会杀死子进程。终端关闭的程序*通常*会因尝试与附加到终端 PTY 的文件句柄进行交互而失败,但如果 stdin/stdout/stderr 被重定向到其他地方,则不会发生这种情况。 (2认同)