2010-05-08 62 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

相關問題