用信号陷阱中断bash中的睡眠

时间:2014-12-29 19:30:20

标签: bash shell

我正在尝试通过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()函数的方式相同?

3 个答案:

答案 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_1sleep 10

process_1 &
  ...
sleep 10 &
wait  

如果您使用wait而不是wait $!,则您的脚本将只等待sleep 10,因为$!表示最后一个后台进程的 PID

答案 2 :(得分:3)

备注

sleep infinity &
wait

将睡眠置于后台,并停止等待信号。这会在每个信号上留下无限的睡眠!

更换睡眠并等待

read

你会没事的。