我的问题与此one非常相似,只是我的后台进程是从脚本开始的。我可能做错了但是当我尝试这个简单的例子时:
#!/bin/bash
set -mb # enable job control and notification
sleep 5 &
睡眠后台命令完成后,我从未收到通知。但是,如果我直接在终端中执行相同的操作,
$ set -mb
$ sleep 5 &
$
[1]+ Done sleep 5
我看到了我期望的输出。
我在cygwin上使用bash。我猜它可能与输出定向的位置有关,但尝试各种输出重定向,我没有更接近。
编辑:所以我有更多关于原因的信息(thx to jkramer),但仍在寻找方法。如何从脚本终止后台进程的“推送”通知?将PID保存到文件和轮询不是我正在寻找的。 p>
答案 0 :(得分:1)
如果您将其作为源文件运行。然后它可以通知。 e.g。
cat foo.sh
#!/bin/bash
set -mb # enable job control and notification
sleep 5 &
. foo.sh
[1]+ Done sleep 5
答案 1 :(得分:0)
shell的作业控制只会影响终端控制的进程,即直接从shell启动的任务。
当父进程(您的脚本)死亡时,init进程自动成为子进程的父进程(您的sleep命令),从而有效地终止所有输出。试试这个例子:
[jkramer/sgi5k:~]# cat foo.sh
#!/bin/bash
sleep 20 &
echo $!
[jkramer/sgi5k:~]# bash foo.sh
19638
[jkramer/sgi5k:~]# ps -ef | grep 19638
jkramer 19638 1 0 23:08 pts/3 00:00:00 sleep 20
jkramer 19643 19500 0 23:08 pts/3 00:00:00 grep 19638
如您所见,脚本终止后的父进程为1,即init进程。如果您需要获得有关终止子进程的通知,您可以保存$!的内容!变量(最后创建的进程的PID)在文件或某处,并使用`wait'命令等待它的终止。