2011-07-20 26 views
5

我見過監視程序或者在腳本中使用'ps'或'服務狀態(在Linux上)「定期檢查進程狀態,或者在C/C++中分支並等待進程...bash使用陷阱SIGCHLD重啓子進程?

I想知道是否有可能在陷阱中使用bash,並在SIGCLD收到時重新啓動子進程?

我已經測試在RedHat Linux基本套房配有以下想法(當然它不工作...)

#!/bin/bash 
set -o monitor # can someone explain this? discussion on Internet say this is needed 
trap startProcess SIGCHLD 
startProcess() { 
    /path/to/another/bash/script.sh & # the one to restart 
    while [ 1 ] 
    do 
    sleep 60 
    done 
} 
startProcess 

什麼bash腳本正在開始只是睡了幾秒鐘,然後退出了現在。

觀察到幾個問題:

    當shell在前臺開始
  • ,SIGCHLD會一次處理。是否會陷入像signal()這樣的重置信號處理?
  • 腳本和它的孩子似乎不受SIGINT的影響,這意味着他們不能通過^ C
  • 停止,因爲無法關閉,所以我關閉了終端。劇本似乎是HUP,許多殭屍小孩都離開了。
  • 在後臺運行時,該腳本導致終端死亡

...無論如何,這並不在所有的工作。我不得不說,我對這個話題知之甚少。 有人可以建議或舉一些工作的例子嗎? 是否有這樣的使用腳本?

如何在bash中使用等待呢?

感謝

回答

6

我可以嘗試回答大家的一些問題,但並非所有基於我 知道。

  1. set -o monitor(或等價地,set -m)打開工作 控制,這是隻有在默認情況下在交互shell。這似乎是要發送SIGCHLD所需的 。但是,作業控制更多的是交互式功能,並非真正用於shell腳本 (另請參閱this question)。

    也請記住這可能不是你打算做 因爲一旦啓用作業控制,SIGCHLD會爲如您運行lsgrep或 什麼,每次發送的存在,每一個 外部命令(當命令完成並且您的陷阱 將運行時,SIGCHLD將會啓動)。

  2. 我懷疑SIGCHLD陷阱只出現一次運行是 因爲你的陷阱處理程序包含一個前景無限循環,讓您的 腳本陷在陷阱處理程序的原因。無論如何,似乎沒有對該循環的點 ,所以你可以簡單地刪除它。

  3. 腳本對SIGINT的「免疫」似乎是啓用作業控制(監視器部分)的效果。我的預感是打開了作業控制, 運行腳本的bash的子實例不再終止 本身以響應SIGINT,而是將SIGINT傳遞到其前臺子進程的 。在腳本中,^C即SIGINT 簡單地就像在其他編程語言 情況下continue聲明,因爲SIGINT會殺了當前運行sleep 60, 於是while循環會立即運行新的sleep 60

  4. 當我試着運行你的腳本,然後殺死它(從另一個 終端),所有我最終都是兩個流浪的睡眠過程。

  5. 背景該腳本也殺死我的殼,雖然 的行爲是不是非常一致(有時它發生 立即,其他時間根本不一致)。它似乎輸入任何鍵比其他 比輸入導致EOF發送以某種方式。即使終端 退出,腳本仍會在後臺運行。我不知道 這裏發生了什麼事。

更具體的想要完成什麼會有所幫助。如果 你只是想要一個命令爲您 腳本生命週期連續運行,你可以在後臺運行一個無限循環,像

while true; do 
    some-command 
    echo some-command finished 
    echo restarting some-command ... 
done & 

注意&done後。

對於其他任務,wait可能比在shell腳本中使用作業控制 更好。再次,這將取決於你正在嘗試 要做什麼。

+0

謝謝吉米,你的分享,甚至測試了可怕的腳本。我已經停止了嘗試,使用'傳統'方式來做 - 循環和檢查一個。但是,我測試了「等待」,它在基本場景中確實運行得非常好。 !'#/斌/慶典 thepid = 0 stopnow = 0 組-o監視 陷阱清理SIGINT SIGTERM 清理(){ 陷阱 - SIGINT SIGTERM stopnow = 1 如果[$ {thepid} -ne 0] 然後 回聲殺死$ {thepid} 殺$ {thepid} 音響 } 而[$ {stopnow} -ne 1] 做 回聲開始 ./trial.sh& thepid = $! echo「等待$ {thepid}」 等待$ {thepid} 完成 退出0 ' –