2010-05-08 30 views
0

我的问题与此one非常相似,只不过我的后台进程是从脚本开始的。我做错了什么,但是当我尝试这个简单的例子:如何在脚本的后台作业完成时收到通知?

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

我从来没有收到通知的睡眠背景命令完成时。但是,如果我直接在终端执行同样的操作,我会看到我期望的输出。

我在cygwin上使用bash。我猜测它可能与输出指向的地方有关,但尝试各种输出重定向,我没有接近。

编辑:所以我有更多关于为什么(thx到jkramer)的信息,但仍然在寻找如何。如何获得“推送”通知,即从脚本开始的后台进程已终止?将PID保存到文件并进行轮询并不是我要找的。

回答

0

shell的作业控制仅影响由终端控制的进程,即直接从shell启动的任务。

当父进程(您的脚本)死亡时,init进程会自动成为子进程(您的睡眠命令)的父级,从而有效地终止所有输出。试试下面这个例子:

[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”命令等待其终止。

+0

谢谢,jkramer - 非常具有说服力。所以我需要做一些不同的事情,但是使用wait命令否定了将子进程发送到后台的要点。我想调用脚本(可以选择背景子进程),然后继续使用同一个终端。如果它在等待,那么终端将不可用,对吧?因此,如果我稍后保存PID以供参考,那么我仍然需要定期轮询以查看它是否已完成,而我希望将通知推送给我。 – 2010-05-09 01:28:08

1

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

cat foo.sh 

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

. foo.sh 
[1]+ Done     sleep 5 
+0

这套-b是我寻找的魔法选项。来自tcsh,我期待“设置通知”工作... – Ted 2015-12-08 18:29:24

相关问题