我试图SIGUSR1
通过sleep
命令在正在睡眠的bash脚本中捕获信号:
#!/bin/bash
trap 'echo "Caught SIGUSR1"' SIGUSR1
echo "Sleeping. Pid=$$"
while :
do
sleep 10
echo "Sleep over"
done
Run Code Online (Sandbox Code Playgroud)
信号陷阱有效,但回显的信息sleep 10
在完成之前不会显示.
看起来bash信号处理在处理信号之前等待当前命令完成.
有没有办法sleep
让它在获得信号后立即中断运行命令,就像C程序中断libc sleep()
功能一样?
Han*_*der 31
#!/bin/bash
trap 'echo "Caught SIGUSR1"' SIGUSR1
echo "Sleeping. Pid=$$"
while :
do
sleep 10 &
wait $!
echo "Sleep over"
done
Run Code Online (Sandbox Code Playgroud)
小智 10
关于wait
之后的一点,sleep
因为我刚刚在我的脚本中犯了这个错误:
您应该在脚本中使用
wait $!
而不是wait
if,而不是在后台启动其他进程
例如,wait
下一段代码内部将等待两者的终止,process_1
并且sleep 10
:
process_1 &
...
sleep 10 &
wait
Run Code Online (Sandbox Code Playgroud)
如果您使用,而不是wait
,wait $!
您的脚本将只等待sleep 10
,因为$!
意味着最后一个后台进程的PID.
请注意
sleep infinity &
wait
Run Code Online (Sandbox Code Playgroud)
将睡眠置于后台,并用信号停止等待。这会在每个信号上留下无限睡眠!
替换睡眠并等待
read
Run Code Online (Sandbox Code Playgroud)
你会没事的。