如果您已经使用 '&' 分叉,什么时候需要 'nohup'?

Ced*_*tin 32 shell nohup fork

首先这个问题是相关的,但绝对不同于这个非常好的问题:

nohup、disown 和 & 之间的区别

我想了解一些事情:当我做 '&' 时,我是在分叉吗?

做“nohup ... &”是否有用,或者只是&足够?

有人可以展示您使用“&”但仍想使用“nohup”的情况吗?

rah*_*hmu 39

首先,每次执行命令时,shell 都会 fork 一个新进程,无论您是否运行它&&仅意味着您在后台运行它。

请注意,这不是很准确。一些命令,比如cdshell 函数,通常不会派生一个新进程。type cmd通常会告诉你cmd是外部命令还是shell函数。type type告诉你它type本身就是一个shell函数。

nohup是不同的东西。它告诉新进程忽略SIGHUP. 它是父shell关闭时内核发送的信号。

要回答您的问题,请执行以下操作:

  1. 运行emacs & (默认情况下应在单独的 X 窗口中运行)
  2. 在父 shell 上,运行exit.

emacs尽管在后台运行,您会注意到窗口已被杀死。这是默认行为,nohup精确用于修改它。

在后台运行作业(使用&bg,我敢打赌其他 shell 也有其他语法)是 shell 的一项功能,源于现代系统的多任务能力。现代 shell(bash, zsh, ksh, ...)将能够管理程序(或作业)列表,而不是为每个要启动的程序创建一个新的 shell 实例。一次只有一个可以在前台,这意味着它获得了 shell 焦点。我希望有人可以更多地扩展在前台运行的进程和在后台运行的进程之间的差异(主要是访问stdin/ stdout)。

在任何情况下,这都不会影响子进程对 的反应方式SIGHUPnohup做。

  • emacs 没有什么特别之处。当外壳本身接收到“SIGHUP”时,外壳通常会向其子进程发送“SIGHUP”,而不是在外壳正常退出时。bash 有一个选项 `huponexit`,它会在它退出时将 `SIGHUP` 发送给孩子,但默认情况下它没有启用。http://www.gnu.org/software/bash/manual/bashref.html#Signals (5认同)
  • 你好。首先,很好的解释。我试图通过使用 `&` 运行一个进程来验证你的论文,并通过运行 `exit` 关闭了我的 shell。该进程仍在运行。关于为什么它没有被杀死的任何想法?还是我在这里遗漏了什么? (2认同)
  • @rahmu 我在 Python 中创建了一个简单的脚本,它每秒创建一个文件,持续 60 秒(愚蠢的方式来真正查看脚本是否正在运行)。我打开终端,用`&`运行脚本,然后运行`exit`命令。终端窗口已关闭,但脚本继续创建文件,即。“还在跑”……? (2认同)

Bru*_*ger 20

这样做有用nohup ... &吗?是的。如果您只是使用 启动一个进程“在后台” &,那么该新进程仍然在原始 shell 的“进程组”中具有成员资格。如果该 shell 或进程组收到某些信号(例如 SIGHUP),默认情况下它们会退出。这意味着,如果您&从由 xterm、rxvt 或其他窗口终端模拟器启动的 shell运行进程,当您关闭窗口时,后台进程会收到一个 SIGHUP。大多数随意编写的代码不处理 SIGHUP,因此会退出。

如果这样做nohup ... &,该nohup命令会将 SIGHUP 设置为忽略,然后执行该命令。新执行的命令会保留nohup设置的信号掩码,除非该命令本身进行一些信号处理。如果您关闭 xterm 或 rxvt 或其他任何东西,内核会将 SIGHUP 传递给命令的进程,该进程将被忽略。它一直在运行。

nohup对命令执行 a允许它在您关闭 xterm 或注销后继续运行。

  • @MikeB - “&”执行通常的 fork/set things/exec 系统调用,以将命令置于“后台”。也就是说,获得 nohupped 的命令是异步运行的。`nohup` 在 `exec()` 系统调用之前做了一些事情,使分叉进程忽略某些信号。所以,是的,“&”将允许命令在某些情况下运行,而普通的旧 `nohup` 不会。就像关闭与执行 nohup 的 shell 关联的 xterm 或注销一样。 (2认同)