为什么后台进程有时会自发停止?

Rob*_*een 11 io terminal job-control background-process

有时,在我用bgbash后台处理一个进程后的一段时间,当我在同一个 shell 中按 Enter 以重新显示提示(只是为了检查当显示后台进程的某些输出时我仍然在 bash 中),后台进程似乎自发停止。

如果我bg再次这样做,同样的问题会再次出现。

修复它的唯一方法似乎是fg.

为什么会发生这种情况?

Mat*_*Mat 13

如果进程尝试从其stdin流中读取,通常会发生这种情况。当进程在后台时,它会收到一个TTIN 信号并因此被冻结(与 STOP 信号的行为相同)。当后台进程尝试写入其终端时,还有双重信号TTOU

将其置于前台会恢复该过程并允许它从您的终端读取。

演示:

$ cat t.sh
#! /bin/sh
sleep 1
read dummy
$ ./t.sh &
[1] 3364
$ 
[1]+  Stopped                 ./t.sh
$ ps aux|grep t.sh
me  3364  0.0  0.0  11268  1200 pts/0    T    17:04   0:00 /bin/sh ./t.sh
Run Code Online (Sandbox Code Playgroud)

避免这种情况的一种方法是使用nohup,但如果程序不处理将其输入流重定向到/dev/null.