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
相关产品推荐
相关产品推荐

