我目前正在运行一个带有&
号的进程.
$ example &
然而,(请注意,我是Linux的新手)我意识到,在发出这样的命令后,我收到一个通知,我的进程收到了一个停止信号.如果我这样做了
$ jobs
我将用我的示例流程获得列表,并在列表中加上一个小注释"Stopped".它真的停止了并且在后台完全不工作了吗?它到底是如何工作的?我从网上得到的信息好坏参半.
我目前正在运行一个带有&
号的进程.
$ example &
然而,(请注意,我是Linux的新手)我意识到,在发出这样的命令后,我收到一个通知,我的进程收到了一个停止信号.如果我这样做了
$ jobs
我将用我的示例流程获得列表,并在列表中加上一个小注释"Stopped".它真的停止了并且在后台完全不工作了吗?它到底是如何工作的?我从网上得到的信息好坏参半.
在Linux和其他Unix系统中,一个在后台运行,但其stdin
(或std::cin
)仍与其控制终端(也称为运行它的窗口)关联的作业(job)将被发送一个SIGTTIN
信号,默认情况下会导致程序完全停止,等待用户将其带到前台(fg %job
或类似),以允许实际向程序提供输入.为了避免程序以这种方式暂停,您可以:
stdin
频道不再与终端相关联,方法是将其重定向到包含适当内容的文件,以便程序输入,或者如果它确实不需要输入,则重定向到/dev/null
,例如myprogram < /dev/null &
.stdin
的关联消失.但这将导致SIGHUP
被传送到程序(意味着输入/输出通道经历"挂起")——这通常会导致程序终止,但这可以通过使用nohup
来避免——例如nohup myprogram &
.如果您对捕获程序的输出感兴趣,这可能是最好的 Select ,因为它可以防止上述两个信号(以及其他两个信号),并保存输出以供您查看,以确定程序执行是否存在任何问题:
nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &