为什么在使用 "> /dev/null 2>&1 &" 执行时不会在注销时终止作业?

Lui*_*len 5 job-control stdout

当您运行如下示例的作业时,它们会在您注销时被杀死:

$ ./job.sh &
Run Code Online (Sandbox Code Playgroud)

但是,当您按照下面的示例执行它们时,将 stdout/dev/null和 stderr重定向到 stdout 并将作业置于后台,当您注销时,它们不会被终止。它有点像 nohup,只是输出转到/dev/null而不是文件。

$ ./job.sh > /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)

我注意到一些守护进程是这样​​工作的,然后我很想知道它们在注销时没有被杀死的原因。

有人可以解释我为什么吗?

编辑 1:

正如@Patrick 在他的评论中所建议的那样,我对有史以来最简单的工作进行了同样的尝试,结果是一样的:当我注销时,工作并没有消失。

# while true; do sleep 1; done > /dev/null 2>&1 &
[1] 4320
# logout

luis-macbook:~ luis$
luis-macbook:Downloads luis$ ssh server
luis.alen@server's password: 
# jobs
#
# ps -ef | grep 4320
root      4320     1  0 01:17 ?        00:00:00 -bash
Run Code Online (Sandbox Code Playgroud)

编辑2:

按照帕特里克的再次要求,我在没有重定向流的情况下做了同样的测试,令我惊讶的是,这个过程并没有终止。现在我完全糊涂了......我发誓我记得当你注销时,进程在后台死亡。我完全错了吗?

# while true; do sleep 1; done &
[1] 20720
# logout
luis-macbook:~ luis$ ssh server
# jobs
#
# ps -ef | grep 20720
root     20720     1  0 23:31 ?        00:00:00 -bash
Run Code Online (Sandbox Code Playgroud)

726*_*368 3

至于守护进程这样做,那是因为它们希望丢弃它们可能产生的任何输出或错误消息,无论您如何重定向进程的输入和输出流,如果它\附加到一个会话,并且该会话关闭以保持进程运行。

\n\n

要使进程保持运行,有几种方法:

\n\n
    \n
  1. 将它们从会话 \xe2\x80\x94 守护进程中分离出来,方法是分叉一个新进程,然后退出原始进程;现在新进程没有父进程并被采用init\n您还可以使用 bash 内部命令 disown 来完成此操作

  2. \n
  3. 用于nohup在会话终止时阻止进程接收 SIGHUP;该进程没有得到 SIGHUP,没有退出,它的父进程死亡并且 init 采用它

  4. \n
  5. 将其附加到不会死的会话 \xe2\x80\x94 使用屏幕

  6. \n
\n\n

请重新检查您对语句“执行时作业不会在注销时被终止> /dev/null 2>&1 &”的工作

\n