向后台进程发送 SIGINT 并不能阻止它

问题描述 投票:0回答:1

给出以下脚本(work.sh)

#! /bin/bash

must_stop=""
function sigint_handler()
{
    echo "SIGINT"
    must_stop="1"

}
trap sigint_handler SIGINT

COUNTER=0
while [ -z "${must_stop}" ]
do
    ((COUNTER+=1))
    echo "#${COUNTER} Working..."
    sleep 1
done

我已将其作为后台进程执行:

$ sh -c "work.sh &"

现在,我想用 SIGINT 来停止它(在前台运行时模拟 Ctrl+C),为此我做到了:

$ ps
  PID TTY          TIME CMD
14125 pts/3    00:00:00 tcsh
27717 pts/3    00:00:00 work.sh
28288 pts/3    00:00:00 sleep
28605 pts/3    00:00:00 ps

$ kill -INT 27717

但它继续打印计数器(没有回显“SIGINT”并且没有停止),为什么?使用 SIGINT(而不是 SIGTERM/SIGKILL)停止它的正确方法是什么?

bash sh tty tcsh
1个回答
0
投票

正如 KamilCuk 提到的, 根据 signal(7) 手册,SIGINT 和 SIGQUIT 均来自键盘。因此,在独立的进程中忽略它们是有意义的。我们需要使用另一个信号(例如 SIGUSR1)

#! /bin/bash

must_stop=""
function sigint_handler()
{
    echo "SIGUSR1"
    must_stop="1"
    exit 1
}
trap sigint_handler SIGUSR1

COUNTER=0
while [ -z "${must_stop}" ]
do
    ((COUNTER+=1))
    echo "#${COUNTER} Working..."
    sleep 1 &
    wait $!
done
© www.soinside.com 2019 - 2024. All rights reserved.