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