我正在尝试通过SIGUSR1
命令在正在睡眠的bash脚本中捕获sleep
信号:
#!/bin/bash
trap 'echo "Caught SIGUSR1"' SIGUSR1
echo "Sleeping. Pid=$$"
while :
do
sleep 10
echo "Sleep over"
done
信号陷阱有效,但在sleep 10
完成之前,不会显示正在回显的信息
看起来bash信号处理在处理信号之前等待当前命令完成。
有没有办法让它在获取信号后立即中断正在运行的sleep
命令,这与C程序中断libc sleep()
函数的方式相同?
答案 0 :(得分:26)
#!/bin/bash
trap 'echo "Caught SIGUSR1"' SIGUSR1
echo "Sleeping. Pid=$$"
while :
do
sleep 10 &
wait $!
echo "Sleep over"
done
答案 1 :(得分:8)
关于wait
之后sleep
的一点,因为我在我的剧本中犯了这个错误:
如果在您的脚本中已经在后台启动了其他进程,则应使用
wait $!
而不是wait
例如,下一段代码中的wait
等待以终止process_1
和sleep 10
:
process_1 &
...
sleep 10 &
wait
如果您使用wait
而不是wait $!
,则您的脚本将只等待sleep 10
,因为$!
表示最后一个后台进程的 PID 。
答案 2 :(得分:3)
备注
sleep infinity &
wait
将睡眠置于后台,并停止等待信号。这会在每个信号上留下无限的睡眠!
更换睡眠并等待
read
你会没事的。