我试图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 $!而不是waitif,而不是在后台启动其他进程
例如,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)
你会没事的。
| 归档时间: |
|
| 查看次数: |
12342 次 |
| 最近记录: |