首先,这个问题是相关的,但绝对不同于这个非常好的问题:
我想了解一些东西:当我做“&”时,我在分叉吗?
做“ nohup ...&”曾经有用还是简单而足够?
有人可以说明您将使用“&”并且仍想使用“ nohup”的情况吗?
首先,这个问题是相关的,但绝对不同于这个非常好的问题:
我想了解一些东西:当我做“&”时,我在分叉吗?
做“ nohup ...&”曾经有用还是简单而足够?
有人可以说明您将使用“&”并且仍想使用“ nohup”的情况吗?
Answers:
首先,每次执行命令时,shell都会派生一个新进程,而不管您是否运行它&
。&
仅表示您在后台运行它。
请注意,这不是很准确。一些命令,例如cd
shell函数,通常不会派生新进程。type cmd
通常会告诉您cmd
是外部命令还是shell函数。type type
告诉您type
本身就是一个shell函数。
nohup
是不同的。它告诉新过程要忽略SIGHUP
。它是关闭父外壳程序时内核发送的信号。
要回答您的问题,请执行以下操作:
emacs &
(默认情况下应在单独的X窗口中运行)。exit
。您会注意到emacs
,尽管在后台运行该窗口,但该窗口仍被杀死。这是默认行为,nohup
正好用于修改它。
在后台运行作业(使用&
或bg
,我敢打赌其他shell也具有其他语法)是shell的功能,其源于现代系统对多任务的能力。相反分叉为要启动的每个程序,现代shell一个新的shell实例(bash
,zsh
,ksh
,...)将不得不管理程序(或列表的能力的工作)。一次只能将其中一个放在前台,这意味着它会成为shell的焦点。我希望有人可以进一步扩展在前台运行的进程和在后台运行的进程之间的区别(主要进程是stdin
/ stdout
)。
无论如何,这都不会影响子进程的反应方式SIGHUP
。nohup
做。
SIGHUP
在外壳程序自身接收时发送给其子进程SIGHUP
,而不是在外壳程序正常退出时发送给其子进程。bash有一个选项huponexit
,使它SIGHUP
在退出时发送给孩子,但默认情况下未启用。 gnu.org/software/bash/manual/bashref.html#Signals
&
并通过运行来关闭我的shell exit
。该过程仍在运行。关于为什么它没有被杀死的任何想法?还是我在这里想念什么?
这样做有用nohup ... &
吗?是。如果您只是使用&
,在“后台”启动一个进程,那么该新进程仍然具有原始shell的“进程组”中的成员资格。如果该外壳程序或进程组收到某些信号(例如SIGHUP),则默认情况下会退出。这意味着,如果&
从xterm或rxvt或其他窗口终端仿真器启动的外壳程序运行进程,则在关闭窗口时,后台进程将得到SIGHUP。大多数随便编写的代码都不处理SIGHUP,因此退出。
如果这样做nohup ... &
,该nohup
命令会将SIGHUP设置为忽略,然后执行该命令。新执行的命令将保留nohup
设置的信号掩码,除非该命令自行执行一些信号处理。如果关闭xterm或rxvt或其他命令,则内核会将SIGHUP传递给命令的进程,该进程将被忽略。它一直在运行。
nohup
在关闭xterm或注销后,对它执行命令可使它继续运行。
&
with nohup
可以使命令在某些情况下(仅使用using nohup
不会)运行吗?这似乎与这里的答案相冲突:unix.stackexchange.com/a/288064/1822
nohup
在之前做一些事情exec()
的系统调用,使派生进程忽略某些信号。因此,是的,“&”将允许命令在普通旧版本不允许的某些情况下运行nohup
。例如,关闭与执行nohup的外壳程序关联的xterm或注销。
nohup
。您对哪一部分感到困惑?