【问题标题】:Sending signals to a linux process and intercepting them向linux进程发送信号并拦截它们
【发布时间】:2013-02-14 17:14:00
【问题描述】:

我有以下 bash 脚本:

#!/bin/bash
for i in {0..8}
do
  trap "echo received $i" $i
done
trap "echo 'receiving the SIGINT'; kill -9  $$" INT
for i in {10..64}
do
  trap "echo receiving the $i" $i
done

sleep 1h

如果运行它并从其他终端发送 SIGINT 给它,它什么也不做。 我正在使用kill -2 pid,其中 pid 是正在运行的脚本的 pid。

如果我在运行脚本的终端中点击 CTRL+C (SIGINT),它会杀死自己并写入消息。怎么,从不同的终端给它发信号不一样?

【问题讨论】:

标签: linux bash process signals


【解决方案1】:

如果我将 sleep 1h 替换为

while true ; do
    sleep 1
done

它正在工作:-)

【讨论】:

    【解决方案2】:

    通常,shell 会传递处理过的信号(“触发一个陷阱”)only between commands。这意味着在子 sleep 进程退出之前,您的脚本的 INT trap 无法启动。

    CTRL+C 的情况下,the terminal sends a SIGINT to the foreground process group。该组包括 your_script.sh 及其子 sleep 1h。子进程立即被杀死,然后脚本也为它收到的信号解除阻塞并触发 trap

    kill -INT 的情况下,SIGINT 只传递给 your_script.sh 而不是传递给它的子节点,所以 trap 保持等待状态直到子节点正常退出。这就是为什么将 sleep 间隔从 1 小时缩短到 1 秒的紧密循环有效的原因:trap 等待时间不超过 1 秒。

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 2019-04-11
      • 2010-12-28
      • 1970-01-01
      • 2016-03-21
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多