40

我目前正在使用该&标志运行一个进程。

$ example &

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

$ jobs

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

4

4 回答 4

85

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

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

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

nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &
于 2013-07-13T02:15:14.387 回答
1

是的,它确实已停止并且不再在后台工作。让它恢复生机类型fg job_number

于 2013-07-12T18:40:02.440 回答
1

从我能收集到的。

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

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

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

于 2019-02-14T21:01:40.507 回答
0

只需输入fgwhich 将在您尝试退出时解决错误。

于 2019-04-29T21:48:19.413 回答