Linux Bash管道和SIGTERM
我有一个Bash脚本“script”,大致如下所示:Linux Bash管道和SIGTERM,linux,bash,pipe,supervisord,Linux,Bash,Pipe,Supervisord,我有一个Bash脚本“script”,大致如下所示: #!/bin/bash cmd1 | cmd2 | cmd3 当我执行kill脚本时(或者更准确地说,当我在supervisord中执行“停止脚本”时),并不是所有的cmd*都被杀死。如何确保它们与生成它们的脚本一起终止?不确定如何使用supervisord,但使用pkill可以使用-p选项从父进程到所有子进程进行终止。下面是进程树(从我运行的ssh守护进程开始) 在一个会话中,我有一个带有pid 27325的脚本test.sh,在另一个
#!/bin/bash
cmd1 | cmd2 | cmd3
当我执行
kill脚本时(或者更准确地说,当我在supervisord
中执行“停止脚本”时),并不是所有的cmd*都被杀死。如何确保它们与生成它们的脚本一起终止?不确定如何使用supervisord
,但使用pkill
可以使用-p
选项从父进程到所有子进程进行终止。下面是进程树(从我运行的ssh守护进程开始)
在一个会话中,我有一个带有pid 27325的脚本test.sh
,在另一个会话中,我运行命令pstree-a-p 1792
(因为sshd
有pid 1792)
在我运行了pkill-TERM-p27325之后:
$ pstree -a -p 1792
sshd,1792
├─sshd,27150
│ └─sshd,27153
│ └─zsh,27154
└─sshd,27182
└─sshd,27184
└─zsh,27185
└─pstree,27387 -a -p 1792
这个答案基本上与stackoverflow上的另一个答案不同:Supervisord有stopasgroup和killasgroup选项(默认为false),用于确定是否将SIGTERM/SIGKILL信号传播到子进程
[program:script]
command=script
stopasgroup=true
killasgroup=true
(这些配置变量都记录在。)另一种解决方案是捕获SIGTERM并杀死陷阱代码中的所有子项
唯一的问题是,shell仅在当前运行的命令完成后才对接收到的信号运行陷阱代码——因此,在您的情况下,仅此一点是没有帮助的
但是,如果shell处于“等待”状态,陷阱将以“异步”方式运行
kill 0
向当前进程组中的所有进程发送SIGTERM
注意:我这里说的是Bash
[program:script]
command=script
stopasgroup=true
killasgroup=true
#!/usr/bin/env bash
trap 'kill 0' TERM
( cmd1 | cmd2 | cmd3 ) & wait