2

我有以下 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 pidwhere pid 是正在运行的脚本的 pid。

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

4

2 回答 2

0

If I replace the sleep 1h with the

while true ; do
    sleep 1
done

It is working :-)

于 2013-02-14T17:22:28.553 回答
0

通常,shell仅在命令之间传递处理过的信号(“触发陷阱”)。这意味着在子睡眠进程退出之前,您的脚本的 INT陷阱无法触发。

CTRL+的C情况下,终端发送一个 SIGINT 到前台进程组。该组包括your_script.sh及其子sleep 1h。子进程立即被杀死,然后脚本也解除阻塞并触发它接收到的信号的陷阱

kill -INT情况下,SIGINT 仅传递给your_script.sh而不是传递给它的子节点,因此trap在子节点正常退出之前一直处于挂起状态。这就是为什么将睡眠间隔从 1 小时减少到 1 秒的紧密循环有效的原因:陷阱等待的时间不超过 1 秒。

于 2015-08-17T13:17:46.483 回答