我目前正在运行带有 &
符号的进程。
$ example &
但是,(请注意我是 Linux 的新手)我意识到在执行这样的命令后差不多一秒钟我收到一条消息,表明我的进程收到了停止信号。如果我这样做
$ jobs
我将获得带有我的示例流程的列表,并带有一个小注释“已停止”。它真的停止了并且在后台根本不工作吗?它究竟是如何工作的?我从 Internet 获得了混合信息。
最佳答案
在 Linux 和其他 Unix 系统中,在后台运行的作业,但仍有其 stdin
(或 std::cin
)与其控制终端(又名运行它的窗口)关联的将发送一个 SIGTTIN
信号,默认情况下会导致程序完全停止,等待用户将其带到前台(fg %job
或类似的)以允许实际向程序提供输入。为避免程序以这种方式暂停,您可以:
- 确保程序
stdin
channel 不再与终端相关联,方法是将其重定向到具有适当内容供程序输入的文件,或重定向到/dev/null
。如果它真的不需要输入 - 例如myprogram < /dev/null &
. - 启动程序后退出终端,会引起与程序的
stdin
的关联走开。但这会导致SIGHUP
传递给程序(意味着输入/输出 channel 经历了“挂断”)——这通常会导致程序终止,但这可以通过使用nohup
来避免。 - 例如nohup myprogram &
.
如果您完全有兴趣捕获程序的输出,这可能是最好的选择,因为它会阻止上述两个信号(以及其他几个信号),并保存输出供您查看确定程序执行是否存在任何问题:
nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &
关于后台 Linux 进程 - 作业中的 "Stopped"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17621798/