首先,这个问题是相关的,但绝对与这个非常好的问题不同:
我想明白一件事:当我做“&”时,我就分叉了,对吧?
执行“nohup ... &”是否有用,或者是否简单且足够?
有人可以展示一个您在使用“&”但仍想使用“nohup”的情况吗?
答案1
首先,每次执行命令时,shell 都会分叉一个新进程,无论您是否运行它&
。&
仅意味着您正在后台运行它。
请注意,这不是很准确。有些命令(例如cd
shell 函数)通常不会派生新进程。type cmd
通常会告诉您cmd
是外部命令还是 shell 函数。type type
告诉你它type
本身是一个 shell 函数。
nohup
是不同的东西。它告诉新进程忽略SIGHUP
。它是父 shell 关闭时内核发送的信号。
要回答您的问题,请执行以下操作:
- 跑步
emacs &
(默认情况下应在单独的 X 窗口中运行)。 - 在父 shell 上,运行
exit
.
您会注意到,emacs
尽管窗口在后台运行,但它已被终止。这是默认行为,nohup
正好用于修改它。
在后台运行作业(使用&
或bg
,我敢打赌其他 shell 也有其他语法)是 shell 的一项功能,源于现代系统的多任务能力。现代 shell(bash
、zsh
、ksh
、 ...)将能够管理程序列表(或工作)。一次只能有一个人在前景,这意味着它获得 shell 焦点。我希望有人能够更多地阐述前台运行的进程和后台运行的进程之间的差异(主要是访问stdin
/ stdout
)。
无论如何,这不会影响子进程对 的反应方式SIGHUP
。nohup
做。
答案2
这样做有用吗nohup ... &
?是的。如果您只是使用“在后台”启动一个进程&
,则该新进程仍然具有原始 shell 的“进程组”的成员身份。如果该 shell 或进程组收到某些信号(例如 SIGHUP),默认情况下它们会退出。这意味着,如果您&
从 xterm、rxvt 或其他一些窗口终端仿真器启动的 shell运行进程,则当您关闭窗口时,后台进程会收到 SIGHUP。大多数随意编写的代码不处理 SIGHUP,因此会退出。
如果这样做nohup ... &
,该nohup
命令会将 SIGHUP 设置为忽略,然后执行该命令。新执行的命令保留设置的信号掩码nohup
,除非该命令本身进行一些信号处理。如果您关闭 xterm 或 rxvt 或其他任何东西,内核会将 SIGHUP 传递给命令的进程,该信号将被忽略。它继续运行。
对命令执行 anohup
可以使其在您关闭 xterm 或注销后继续运行。
答案3
我在这里没有看到提到的一件事是,“在终端退出时发送 HUP”事件是可配置的 - 它可能会也可能不会发生。这可能会混淆一些人对nohup
工作方式的看法。如果在终端退出时发送 HUP 已被禁用,他们将得出nohup
不需要的结论。在终端退出时发送 HUP 是 bash 中的一个 shell 选项。
尝试
shopt | grep huponexit
这将告诉您 HUP 是否在终端退出时发送。如果是,则需要使用 nohup。如果不是,你就不会。
答案4
如果您在 Linux 操作系统上在后台运行一个程序(以 & 作为后缀),并且注销后它仍会继续运行:尝试使用:
ping google.com > ping_result &
重新登录后,检查输出文件中的行数ping_result
将继续增加,这意味着它仍在运行,但已被告知它将被关闭。那么命令有什么用呢nohup
。
另一种情况 ==> 如上面所述nohup emac &
--> 应该emac
在系统注销后继续运行,但在重新登录后不会显示运行。