当您运行如下示例的作业时,它们会在您注销时被杀死:
$ ./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)
我注意到一些守护进程是这样工作的,然后我很想知道它们在注销时没有被杀死的原因。
有人可以解释我为什么吗?
正如@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)
按照帕特里克的再次要求,我在没有重定向流的情况下做了同样的测试,令我惊讶的是,这个过程并没有终止。现在我完全糊涂了......我发誓我记得当你注销时,进程在后台死亡。我完全错了吗?
# while true; do sleep 1; done &
[1] 20720
# logout …
Run Code Online (Sandbox Code Playgroud)