小编Nic*_*ico的帖子

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

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

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

cdist-mass-deploy ...
   cdist-deploy-to ...
       cdist-explorer-run-global ...
           cdist-dir ....
Run Code Online (Sandbox Code Playgroud)

我想要的是退出/终止所有脚本,只要cdist-mass-deploy由控制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
Run Code Online (Sandbox Code Playgroud)

但这会导致丑陋的终止消息以及shell中的段错误(破折号,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
Run Code Online (Sandbox Code Playgroud)

所以问题是,如何以可移植的方式干净地退出包括所有(子)子节点(bourne shell,不需要csh支持)?

shell configuration posix

9
推荐指数
1
解决办法
558
查看次数

标签 统计

configuration ×1

posix ×1

shell ×1