一尘不染

Linux进程在后台-作业“停止”了吗?

linux

我当前正在运行带有&标志的进程。

$ example &

但是,(请注意,我是Linux的新手)我意识到,在执行此命令后几乎一秒钟,我就收到一条消息,指出我的进程收到了停止的信号。如果我做

$ jobs

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


阅读 388

收藏
2020-06-03

共1个答案

一尘不染

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

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

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

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