首页 文章

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

提问于
浏览
19

我正试图通过 sleep 命令在正在睡眠的bash脚本中捕获 SIGUSR1 信号:

#!/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 回答

  • 8
    #!/bin/bash
    
    trap 'echo "Caught SIGUSR1"' SIGUSR1
    
    echo "Sleeping.  Pid=$$"
    while :
    do
       sleep 10 &
       wait $!
       echo "Sleep over"
    done
    
  • 25

    关于 sleep 之后的 wait 只是一点,因为我刚刚在我的脚本中犯了这个错误:

    你应该使用等待$!如果在脚本中已经在后台启动了其他进程,则不要等待

    例如,下一段代码中的 wait 将等待 process_1sleep 10 的终止:

    process_1 &
      ...
    sleep 10 &
    wait
    

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

  • 3

    备注

    sleep infinity &
    wait
    

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

    更换睡眠并等待

    read
    

    你会没事的

相关问题