【问题标题】:Linux process in background - "Stopped" in jobs?Linux 进程在后台 - 在作业中“停止”?
【发布时间】:2013-07-11 09:39:38
【问题描述】:

我目前正在运行一个带有& 符号的进程。

$ example &

但是,(请注意,我是 Linux 的新手)我意识到,在这样的命令之后差不多一秒钟,我收到一条消息,表明我的进程收到了停止的信号。如果我这样做了

$ jobs

我将通过我的示例流程获得列表,并带有一点“已停止”的注释。它真的停止并且在后台根本不工作吗?它究竟是如何工作的?我从互联网上得到了混杂的信息。

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    只需输入fg,当您尝试退出时,这将解决错误。

    【讨论】:

      【解决方案2】:

      据我所知。

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

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

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

      【讨论】:

        【解决方案3】:

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

        1. 确保程序 stdin 频道不再与终端关联,方法是将其重定向到具有适当内容的文件以供程序输入,或者如果确实不需要输入,则重定向到 /dev/null - 例如。 myprogram < /dev/null &
        2. 启动程序后退出终端,会导致与程序stdin的关联消失。但这会导致SIGHUP 被传递给程序(意味着输入/输出通道经历了“挂起”)——这通常会导致程序终止,但可以通过使用nohup 来避免这种情况——例如nohup myprogram &

        如果您对捕获程序的输出感兴趣,这可能是最好的选择,因为它可以防止上述两种信号(以及其他几种信号),并保存输出供您查看确定程序执行是否有任何问题:

        nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &
        

        【讨论】:

          【解决方案4】:

          是的,它确实已停止并且不再在后台工作。要让它恢复活力,请输入 fg job_number

          【讨论】:

          • 那么...你是如何让它在后台运行的呢?如何在后台运行我的服务器应用程序,这样它们才能真正工作而不会在终端中阻止我?
          • 如果后台进程试图从它正在运行的终端读取数据,它将被停止,以便您可以将其置于前台并提供所需的输入。如果您希望它不输入任何内容,请使用example &lt; /dev/null &amp;
          • @twalberg 你应该把它作为一个单独的答案,因为它应该被认为是正确的。
          • @user1255410 查看minecraftforum.net/forums/archive/legacy-support/… - 他说的是我的世界服务器 cli,但它概括了一切
          最近更新 更多