【问题标题】:shell script to spawn processes, terminate children on SIGTERM生成进程的 shell 脚本,在 SIGTERM 上终止子进程
【发布时间】:2010-11-01 20:11:49
【问题描述】:

我想编写一个 shell 脚本,在后台生成几个长时间运行的进程,然后挂起。收到 SIGTERM 后,我希望所有子进程也终止。

基本上,我想要一个“主进程”。

这是我目前得到的:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

# supposedly this should kill the child processes on SIGTERM. 
trap "kill $PID1 $PID2" SIGTERM 

wait

上面的脚本失败了trap: 10: SIGTERM: bad trap

编辑:我使用的是 Ubuntu 9.04

【问题讨论】:

    标签: bash scripting sh long-running-processes sigterm


    【解决方案1】:

    这对我有用:

    trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
    
    • kill -- -$$ 向整个进程组发送SIGTERM,从而也杀死后代。

    • 指定信号EXIT 在使用set -e 时很有用(更多详细信息here)。

    【讨论】:

    • pid 0 是什么意思?您是指字面意义上的...,还是作为占位符?
    • 不知何故,这仅在我使用kill -- 0 代替kill -- -$$ 时才对我有用。后者出于某种原因说11641: no process found
    • trap "trap - TERM && kill -- -$$" INT TERM EXIT 为我们的 POSIX 爱好者。
    【解决方案2】:

    乔的回答让我走上了正轨。 我还发现我应该捕获更多信号来覆盖我的基地。

    最终脚本如下所示:

    #!/bin/sh
    
    sleep 600 &
    PID1="$!"
    
    sleep 600 &
    PID2="$!"
    
    trap "kill $PID1 $PID2" exit INT TERM
    
    wait
    

    【讨论】:

    • 如果您认为必须使用信号编号,则应仅使用标准化的编号。但我建议改用您系统的信号名称。
    • 好吧,这是您的代码,您可以拥有任意多个版本;-)
    【解决方案3】:

    我怀疑您的 /bin/sh 不是 Bash(尽管您将问题标记为“Bash”)。

    从消息中我猜它是 DASH。如果您需要编写 Bash 代码,请查看其手册或修复您的 shebang。

    【讨论】:

      【解决方案4】:

      这个脚本看起来是正确的,可以按预期为我工作。

      如何将 SIGTERM 信号发送到“主进程”? 也许您应该执行kill -l 来检查支持哪些信号。 正如错误消息所示,您发送的信号“10”您的系统似乎无法识别。

      下次你应该为这样的问题添加操作系统、shell 版本、内核……

      【讨论】:

      • 感谢您的回复。我正在使用 Ubuntu 9.04,阅读您的答案后,我意识到这可能是 bash 与 dash 的对比。如果我将第一行更改为 #!/bin/bash,它确实像宣传的那样工作
      猜你喜欢
      • 2021-11-08
      • 2016-09-29
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 2022-01-19
      • 2011-12-10
      • 2013-11-22
      • 2015-03-14
      相关资源
      最近更新 更多