我目前正在使用该&
标志运行一个进程。
$ example &
但是,(请注意,我是 Linux 的新手)我意识到,在这样的命令之后几乎一秒钟,我就收到了一条消息,表明我的进程收到了一个停止的信号。如果我做
$ jobs
我将通过我的示例流程获取列表,并带有一点“已停止”的注释。它真的停止并且在后台根本不工作吗?它究竟是如何工作的?我从互联网上得到混合信息。
在 Linux 和其他 Unix 系统中,一个在后台运行的作业,但仍然与其控制终端(也就是运行它的窗口)相关联的stdin
(或std::cin
)将被发送一个SIGTTIN
信号,这默认情况下会导致程序完全停止,等待用户将其带到前台(fg %job
或类似的地方)以允许将输入实际提供给程序。为避免程序以这种方式暂停,您可以:
stdin
通道不再与终端关联,方法是将其重定向到具有适当内容的文件以供程序输入,或者/dev/null
如果它确实不需要输入 - 例如myprogram < /dev/null &
.stdin
消失。但这会导致 aSIGHUP
被传递给程序(意味着输入/输出通道经历了“挂起”) - 这通常会导致程序终止,但这可以通过使用来避免nohup
- 例如nohup myprogram &
。如果您对捕获程序的输出完全感兴趣,这可能是最好的选择,因为它可以防止上述两个信号(以及其他几个信号),并保存输出供您查看以确定是否程序执行有任何问题:
nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &
是的,它确实已停止并且不再在后台工作。让它恢复生机类型fg
job_number
从我能收集到的。
后台作业被阻止读取用户的终端。当尝试这样做时,它将被暂停,直到用户将其带到前台并提供一些输入。“从用户终端读取”可以意味着直接尝试从终端读取或更改终端设置。
通常这就是您想要的,但有时程序从终端读取和/或更改终端设置不是因为它们需要用户输入才能继续,而是因为它们想要检查用户是否试图提供输入。
http://curiousthing.org/sigttin-sigttou-deep-dive-linux有血淋淋的技术细节。
只需输入fg
which 将在您尝试退出时解决错误。