如何在中断时杀死当前shell的所有子级?

如何在中断时杀死当前shell的所有子级?,shell,configuration,posix,Shell,Configuration,Posix,我的脚本cdist deploy to和cdist mass deploy(来自配置管理)以交互方式运行(即由用户调用) 这些脚本调用了很多脚本,这些脚本又调用了一些脚本: cdist-mass-deploy ... cdist-deploy-to ... cdist-explorer-run-global ... cdist-dir .... 我想要的是退出/终止所有脚本,只要cdist mass deploy被控件C(SIGINT)停止或被SIGT

我的脚本cdist deploy to和cdist mass deploy(来自配置管理)以交互方式运行(即由用户调用)

这些脚本调用了很多脚本,这些脚本又调用了一些脚本:

cdist-mass-deploy ...
   cdist-deploy-to ...
       cdist-explorer-run-global ...
           cdist-dir ....
我想要的是退出/终止所有脚本,只要cdist mass deploy被控件C(SIGINT)停止或被SIGTERM终止

cdist deploy to也可以交互调用,并且应该表现出相同的行为

使用ps-ef。。。用ppid查找所有进程的联合变体看起来可能非常不适合移植。使用$!不起作用,因为在更深层次上,孩子们没有背景过程

我尝试使用以下代码:

__cdist_kill_on_interrupt()
{
   __cdist_tmp_removal
   kill 0
   exit 1
}

trap __cdist_kill_on_interrupt INT TERM
但这会导致难看的终止消息以及shell(dash、bash、zsh)中的segfault,并且似乎不会立即停止所有操作:

# 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支持)干净地退出,包括所有(子)子进程?

您不需要处理^C,这将导致向整个进程组发送信号,这将杀死所有不在后台的进程。所以你不需要捕捉INT

当你杀死他们时,你得到终止的唯一原因是kill默认发送一个术语,但是如果你首先处理一个术语,这是合理的。如果要避免这些消息,可以使用kill-INT 0

(回复额外信息)


如果子进程在后台运行,您可以在启动它们之后使用$获取它们的进程ID!特殊shell变量。将这些集合在一个变量中,并在需要终止时将其全部删除。

+1。但是我有点担心讨论杀婴的问题。非常感谢!但是,背景是什么呢?cdist mass deploy启动许多cdist部署过程,这些过程是后台的,并使用
wait
等待。