【问题标题】:Unable to trap SIGINT signal in a background shell无法在后台 shell 中捕获 SIGINT 信号
【发布时间】:2011-04-13 00:26:33
【问题描述】:

在子/后台进程中运行时,我无法捕获信号。

这是我的简单 bash 脚本:

#!/bin/bash

echo "in child"

trap "got_signal" SIGINT

function got_signal {
  echo "trapped"
  exit 0
}

while [ true ]; do
    sleep 2
done

当运行这个和以后做

kill -SIGINT (pid)

一切正常,打印trapped 并退出。

现在,如果我从这样的父脚本启动相同的脚本:

#!/bin/bash

echo "starting the child"

./child.sh &

那么孩子就不再捕获信号了....?

改用 SIGTERM 而不是 SIGINT 后,它似乎工作正常...?

【问题讨论】:

    标签: bash signals child-process sigint bash-trap


    【解决方案1】:

    OSX 上的bash 手册页(但在其他版本中应该相同)对信号处理有这样的说法:

    bash 运行的非内置命令将信号处理程序设置为值 由外壳从其父级继承。当作业控制不在时 效果,异步命令除了忽略SIGINTSIGQUIT 这些继承的处理程序。

    然后,在trap 命令下:

    进入 shell 时忽略的信号不能 被困或重置。

    由于默认情况下脚本不使用作业控制,这意味着您正在谈论的情况。

    【讨论】:

      【解决方案2】:

      根据您的说明:

      Signals ignored upon entry to the shell cannot be trapped or reset.
      

      我注意到 ZSH 不会忽略父进程和子进程之间来回发送的信号,但 bash 会。这是我自己发布的问题:

      Trapping CHLD signal - ZSH works but ksh/bash/sh don't?

      【讨论】:

        猜你喜欢
        • 2016-04-05
        • 2015-01-28
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多