后台 Linux 进程 - 作业中的 "Stopped"?

标签 linux bash

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

$ example &

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

$ jobs

我将获得带有我的示例流程的列表,并带有一个小注释“已停止”。它真的停止了并且在后台根本不工作吗?它究竟是如何工作的?我从 Internet 获得了混合信息。

最佳答案

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

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

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

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

关于后台 Linux 进程 - 作业中的 "Stopped"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17621798/

相关文章:

bash - 检查是否在 BASH 的变量中找到字符的最简单方法是什么?

bash - 需要帮助创建处理多个身份验证提示的 bash 脚本

linux - 使用 wpa_supplicant 与 connmanctl 在 Linux 平台上设置 WiFi?

c++ - 如何在 Linux 上强制关闭套接字?

bash - 为 http 响应中的每一行添加换行符

python - GNU Parallel 替换管道 xargs -n 1

linux - 使用 sed 和正则表达式替换 html 内容

Linux:让服务永远运行直到我停止它? Node.js + Socket.io

php - 确保Linux上只有一个正在运行的PHP进程

linux - 识别汇编中的库调用