2011-06-08 96 views
9

我的腳本cdist-deploy-to和cdist-mass-deploy(從cdist配置管理)以交互方式運行(即由用戶調用)。如何殺死當前shell中的所有子進程?

這些腳本調用了大量的腳本,再次調用一些腳本:

cdist-mass-deploy ... 
    cdist-deploy-to ... 
     cdist-explorer-run-global ... 
      cdist-dir .... 

我想是退出/殺死所有的腳本,只要cdist質量部署或者通過控件C停止(SIGINT)或者用SIGTERM殺死。

cdist-deploy-to也可以交互方式調用,並且應該表現出相同的行爲。

使用ps -ef ...和co變體找出所有與ppid相似的進程看起來可能相當不可移植。使用$!在深層次上不起作用,所以孩子們沒有後臺進程。

我用下面的代碼嘗試:

__cdist_kill_on_interrupt() 
{ 
    __cdist_tmp_removal 
    kill 0 
    exit 1 
} 

trap __cdist_kill_on_interrupt INT TERM 

但是這會導致難看的終止信息,以及在炮彈段錯誤(破折號,bash和zsh中),似乎沒有立即反正停止一切:

# cdist-mass-deploy -p ikq04.ethz.ch ikq05.ethz.ch 
core: Waiting for cdist-deploy-to jobs to finish 
^CTerminated 
Terminated 
Terminated 
Terminated 
Segmentation fault 

所以,問題是,如何完全退出,包括便攜式的方式(Bourne shell中,沒有CSH支持所需的)所有(子)的孩子嗎?

+1

+1。但我有點擔心討論殺嬰問題。 – Hyperboreus 2011-06-16 23:05:03

回答

1

您不需要處理^ C,這將導致信號被髮送到整個進程組,這將殺死所有不在後臺的進程。所以你不需要捕獲INT。

當你殺死他們時,你終止的唯一原因是kill在默認情況下發送TERM,但如果你首先處理TERM,這是合理的。如果你想避免消息,你可以使用kill -INT 0。

如果子進程在後臺運行,你可以得到他們的進程ID開始他們只是後,使用$(具有額外的信息響應)!特殊的shell變量。將這些聚集在一個變量中,並在需要終止時全部殺死它們。

+1

非常感謝!但是,那些背後的過程呢? cdist-mass-deploy啓動了大量的cdist-deploy過程,這些過程是後臺操作並等待使用「wait」。 – Nico 2011-06-18 08:55:16