后台的Linux进程 - 在工作中“停止”?

时间:2013-07-12 18:37:05

标签: linux bash

我目前正在使用&符号运行流程。

$ example &

然而,(请注意我是Linux的新手)我意识到在这样的命令之后差不多一秒钟我得到一个注释,我的进程收到一个停止的信号。如果我做

$ jobs

我将获得带有我的示例流程的列表,其中包含一些注释“已停止”。它真的停了下来而且根本没有工作吗?它是如何工作的?我从互联网上获得了混合信息。

4 个答案:

答案 0 :(得分:64)

在Linux和其他Unix系统中,一个在后台运行但仍然与其控制终端关联的stdin(或std::cin)的作业(也就是运行它的窗口)将发送SIGTTIN信号,默认情况下会导致程序完全停止,等待用户将其置于前台(fg %job或类似),以允许实际输入程序。为避免程序以这种方式暂停,您可以:

  1. 确保程序stdin频道不再与终端关联,方法是将其重定向到具有要输入的程序的适当内容的文件,或者/dev/null如果它实际上没有需要输入 - 例如myprogram < /dev/null &
  2. 启动程序后退出终端,这将导致与程序stdin的关联消失。但是这会导致SIGHUP被传递到程序(意味着输入/输出通道经历了“挂断”) - 这通常会导致程序被终止,但这可以通过使用{{1}来避免 - 例如nohup
  3. 如果您对捕获程序的输出感兴趣,这可能是最佳选择,因为它可以防止上述两种信号(以及其他几种信号),并保存输出供您查看确定程序执行是否存在任何问题:

    nohup myprogram &

答案 1 :(得分:1)

是的,它确实已停止,不再在后台工作。要使其恢复生命,请输入fg job_number

答案 2 :(得分:1)

只需输入fg即可解决错误,然后尝试退出。

答案 3 :(得分:0)

据我所知。

阻止后台作业读取用户终端。当尝试这样做时,它将被挂起,直到用户将其带到前台并提供一些输入。 “从用户终端读取”可能意味着直接尝试从终端读取或更改终端设置。

通常这就是您想要的,但是有时程序从终端读取和/或更改终端设置不是因为它们需要用户输入才能继续,而是因为它们想检查用户是否尝试提供输入。

http://curiousthing.org/sigttin-sigttou-deep-dive-linux具有血腥的技术细节。