【问题标题】:Bash pipe and SIGTERMBash 管道和 SIGTERM
【发布时间】:2012-03-13 08:20:02
【问题描述】:

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

#!/bin/bash

cmd1 | cmd2 | cmd3

当我执行kill script 时(或者更准确地说,当我在supervisord 中执行“停止脚本”时),并不是所有的 cmd* 都会被杀死。如何确保它们与生成它们的脚本一起被终止?

【问题讨论】:

    标签: linux bash pipe supervisord


    【解决方案1】:

    Supervisord 有 stopasgroupkillasgroup 选项(默认为 false),它们决定是否将 SIGTERM/SIGKILL 信号传播到子进程。

    [program:script]
    command=script
    stopasgroup=true
    killasgroup=true
    

    (这些配置变量都记录在http://supervisord.org/configuration.html。)

    【讨论】:

      【解决方案2】:

      不确定如何使用supervisord,但使用pkill,您可以使用-P 选项从父进程到所有子进程终止。这是进程树(从我正在运行的 ssh 守护进程开始)。

      $ pstree -a -p 1792
      sshd,1792
        ├─sshd,27150
        │   └─sshd,27153
        │       └─zsh,27154
        │           └─test.sh,27325 ./test.sh
        │               └─cat,27326
        └─sshd,27182
            └─sshd,27184
                └─zsh,27185
                    └─pstree,27357 -a -p 1792
      

      在一个会话中,我有一个脚本 test.sh,pid 为 27325,而在另一个会话中,我正在运行命令 pstree -a -p 1792(因为 sshd 的 pid 为 1792)

      在我运行pkill -TERM -P 27325之后:

      $ pstree -a -p 1792   
      sshd,1792
        ├─sshd,27150
        │   └─sshd,27153
        │       └─zsh,27154
        └─sshd,27182
            └─sshd,27184
                 └─zsh,27185
                    └─pstree,27387 -a -p 1792
      

      这个答案基本上是从 stackoverflow 上的另一个答案改写而来的:https://stackoverflow.com/a/392155/263969

      【讨论】:

        【解决方案3】:

        另一种解决方案是捕获 SIGTERM 并杀死陷阱代码中的所有子项。

        唯一的问题是,shell 仅在当前运行的命令完成后才为接收到的信号运行陷阱代码——所以在你的情况下,仅此一项是没有帮助的。

        但是,如果 shell 处于“等待”状态,陷阱将以“异步”方式运行。

        #!/usr/bin/env bash
        trap 'kill 0' TERM
        ( cmd1 | cmd2 | cmd3 ) & wait
        

        kill 0 向当前进程组中的所有进程发送 SIGTERM。

        注意:我在这里谈论的是 Bash。

        【讨论】:

          猜你喜欢
          • 2016-06-18
          • 1970-01-01
          • 2023-03-26
          • 2013-05-03
          • 1970-01-01
          • 2012-05-11
          • 2010-09-06
          • 2012-04-15
          • 2014-03-02
          相关资源
          最近更新 更多