1

我的问题与这个问题非常相似,只是我的后台进程是从脚本启动的。我可能做错了什么,但是当我尝试这个简单的例子时:

#!/bin/bash
set -mb  # enable job control and notification
sleep 5  &

睡眠后台命令完成时,我从未收到通知。但是,如果我直接在终端中执行相同的操作,

$ set -mb  
$ sleep 5  &
$
[1]+  Done                    sleep 5

我看到了我期望的输出。

我在cygwin上使用bash。我猜这可能与输出指向的位置有关,但尝试各种输出重定向,我并没有更接近。

编辑:所以我有更多关于原因的信息(感谢 jkramer),但仍在寻找方法。如何获得从脚本启动的后台进程已终止的“推送”通知?将 PID 保存到文件并轮询不是我想要的。

4

2 回答 2

1

如果您将其作为源文件运行。然后它可以通知。例如

cat foo.sh

#!/bin/bash
set -mb  # enable job control and notification
sleep 5  &

. foo.sh
[1]+  Done                    sleep 5
于 2012-03-15T09:36:44.893 回答
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

可以看到,脚本终止后sleep的父进程为1,即init进程。如果您需要收到有关您的子进程终止的通知,您可以保存 $! 变量(最后创建的进程的PID)在文件或某处,并使用“等待”命令等待其终止。

于 2010-05-08T21:10:01.447 回答