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)
我注意到一些守护进程是这样工作的,然后我很想知道它们在注销时没有被杀死的原因。
有人可以解释我为什么吗?
正如@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
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)
至于守护进程这样做,那是因为它们希望丢弃它们可能产生的任何输出或错误消息,无论您如何重定向进程的输入和输出流,如果它\附加到一个会话,并且该会话关闭以保持进程运行。
\n\n要使进程保持运行,有几种方法:
\n\n将它们从会话 \xe2\x80\x94 守护进程中分离出来,方法是分叉一个新进程,然后退出原始进程;现在新进程没有父进程并被采用init
\n您还可以使用 bash 内部命令 disown 来完成此操作
用于nohup
在会话终止时阻止进程接收 SIGHUP;该进程没有得到 SIGHUP,没有退出,它的父进程死亡并且 init 采用它
将其附加到不会死的会话 \xe2\x80\x94 使用屏幕
请重新检查您对语句“执行时作业不会在注销时被终止> /dev/null 2>&1 &
”的工作
归档时间: |
|
查看次数: |
1364 次 |
最近记录: |