Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash管道和SIGTERM_Linux_Bash_Pipe_Supervisord - Fatal编程技术网

Linux Bash管道和SIGTERM

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,在另一个

我有一个Bash脚本“script”,大致如下所示:

#!/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有stopasgroupkillasgroup选项(默认为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