首页 > 解决方案 > 带有捕获信号的 shell 脚本不会忽略信号

问题描述

我正在开发一个测试自动化系统,我想出了一些行为不端的程序。对于第一个,我已经遇到了一些意想不到的行为。

    trap "echo No thanks" INT                            

    echo Let me just chill for $1 sec  
    sleep $1                                     
    echo All finished

观察到的行为:

预期行为:

问题:

这个问题本质上是一个骗局,但答案没有令人满意的解释。

标签: linuxbashunixprocess

解决方案


目前:

  1. bash等待sleep退出
  2. bashsleep接收信号
  3. sleep
  4. bash完成等待并运行陷阱

这会阻止您想要的行为,因为:

  • sleep不想死
  • 您不想bash在运行陷阱之前等待命令完成

要解决此问题,您可以sleep忽略 sigint,并在循环中bash运行wait,以便主脚本在 ctrl-c 后重新获得控制权,但仍等待sleep完成:

trap 'echo "No thanks"' INT
echo "Let me just chill for $1 sec"
# Run sleep in the background
sleep "$1" &
# Loop until we've successfully waited for all processes
until wait; do true; done
echo "All finished"

推荐阅读