如何在脚本的后台作业完成时收到通知?

时间:2010-05-08 20:06:35

标签: bash scripting background jobs notify

我的问题与此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保存到文件和轮询不是我正在寻找的。

2 个答案:

答案 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'命令等待它的终止。