首先这个问题是相关的,但绝对不同于这个非常好的问题:
我想了解一些事情:当我做 '&' 时,我是在分叉吗?
做“nohup ... &”是否有用,或者只是&足够?
有人可以展示您使用“&”但仍想使用“nohup”的情况吗?
rah*_*hmu 39
首先,每次执行命令时,shell 都会 fork 一个新进程,无论您是否运行它&
。&
仅意味着您在后台运行它。
请注意,这不是很准确。一些命令,比如cd
shell 函数,通常不会派生一个新进程。type cmd
通常会告诉你cmd
是外部命令还是shell函数。type type
告诉你它type
本身就是一个shell函数。
nohup
是不同的东西。它告诉新进程忽略SIGHUP
. 它是父shell关闭时内核发送的信号。
要回答您的问题,请执行以下操作:
emacs &
(默认情况下应在单独的 X 窗口中运行)。exit
.emacs
尽管在后台运行,您会注意到窗口已被杀死。这是默认行为,nohup
精确用于修改它。
在后台运行作业(使用&
或bg
,我敢打赌其他 shell 也有其他语法)是 shell 的一项功能,源于现代系统的多任务能力。现代 shell(bash
, zsh
, ksh
, ...)将能够管理程序(或作业)列表,而不是为每个要启动的程序创建一个新的 shell 实例。一次只有一个可以在前台,这意味着它获得了 shell 焦点。我希望有人可以更多地扩展在前台运行的进程和在后台运行的进程之间的差异(主要是访问stdin
/ stdout
)。
在任何情况下,这都不会影响子进程对 的反应方式SIGHUP
。nohup
做。
Bru*_*ger 20
这样做有用nohup ... &
吗?是的。如果您只是使用 启动一个进程“在后台” &
,那么该新进程仍然在原始 shell 的“进程组”中具有成员资格。如果该 shell 或进程组收到某些信号(例如 SIGHUP),默认情况下它们会退出。这意味着,如果您&
从由 xterm、rxvt 或其他窗口终端模拟器启动的 shell运行进程,当您关闭窗口时,后台进程会收到一个 SIGHUP。大多数随意编写的代码不处理 SIGHUP,因此会退出。
如果这样做nohup ... &
,该nohup
命令会将 SIGHUP 设置为忽略,然后执行该命令。新执行的命令会保留nohup
设置的信号掩码,除非该命令本身进行一些信号处理。如果您关闭 xterm 或 rxvt 或其他任何东西,内核会将 SIGHUP 传递给命令的进程,该进程将被忽略。它一直在运行。
nohup
对命令执行 a允许它在您关闭 xterm 或注销后继续运行。