我的脚本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。但我有点担心讨论杀婴问题。 – Hyperboreus 2011-06-16 23:05:03