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

use*_*410 28 linux bash

我目前正在运行带有&标志的流程.

$ example &
Run Code Online (Sandbox Code Playgroud)

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

$ jobs
Run Code Online (Sandbox Code Playgroud)

我将使用我的示例流程获取列表,并附上一个"停止"的小注释.它真的停了下来而且根本没有工作吗?它是如何工作的?我从互联网上获得了混合信息.

twa*_*erg 68

在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 &
Run Code Online (Sandbox Code Playgroud)