You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

bash脚本接收SIGUSR1/SIGUSR2后终止,如何持续监听信号?

解决Bash脚本监听SIGUSR1/SIGUSR2后终止的问题

问题原因

你执行kill -USR1 -$PID时,是向整个进程组发送USR1信号——脚本本身和它启动的sleep inf进程属于同一个进程组。sleep收到USR1信号后会直接中断退出,脚本后续没有其他执行逻辑,因此也跟着终止。

两种解决方法

方法1:仅向脚本进程发送信号

不要使用负号指定进程组,直接给脚本PID发信号:

kill -USR1 $PID

这样只有脚本进程会收到信号,sleep inf不受影响,脚本会持续监听。

方法2:让sleep忽略目标信号(适配进程组信号场景)

如果必须向进程组发送信号,可以修改脚本,让sleep进程忽略USR1/USR2:

#!/usr/bin/env bash

trigger() {
  echo "receiving signal"
}

echo $$
trap trigger USR1 USR2

# 在子shell中让sleep忽略USR1和USR2,避免被信号中断
( trap '' USR1 USR2; sleep inf )

或者用循环维持脚本运行,即使sleep被中断也能重启:

#!/usr/bin/env bash

trigger() {
  echo "receiving signal"
}

echo $$
trap trigger USR1 USR2

# 无限循环启动sleep,中断后自动重启
while :; do
  sleep inf
done

内容的提问来源于stack exchange,提问作者what the

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:53:16