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