2011-06-08 155 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