有时,在我使用bg
bash 将进程后台运行一段时间后,当我在同一个 shell 中按 Enter 重新显示提示时(只是为了在显示后台进程的某些输出时检查我是否仍在 bash 中),后台进程似乎自发停止。
如果我bg
再次这样做,同样的问题会再次出现。
解决这个问题的唯一方法似乎是fg
。
为什么会出现这种情况?
答案1
如果进程尝试从其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
避免这种情况的方法之一是使用nohup
,但是如果程序不处理将其输入流重定向到/dev/null
.