Bash脚本:无法正确处理SIGTSTP

时间:2012-10-10 17:01:57

标签: linux bash signals bash-trap

我有一个bash脚本,用于安装和卸载设备,在其间执行一些读取操作。由于设备非常慢,脚本需要大约15秒才能完成(安装至少需要5-6秒)。由于安装此设备可能会导致其他问题,我不希望此脚本被中断。

话虽如此,我可以正确处理SIGINT(Ctrl + c),但是当我尝试处理SIGTSTP(Ctrl + z)时,脚本会冻结。这意味着信号被捕获但处理程序不运行。

#!/bin/sh
cleanup()
{
    # Don't worry about unmounting yet. Just checking if trap works.
    echo "Quitting..." > /dev/tty
    exit 0
}
trap 'cleanup' SIGTSTP
...

我手动必须将KILL信号发送到进程。知道为什么会这样,以及我如何解决它?

1 个答案:

答案 0 :(得分:6)

在当前正在执行的进程终止之前,shell不会执行陷阱。 (至少,这是bash 3.00.15的行为)。如果通过^ c发送SIGINT,它将被发送到前台进程组中的所有进程;如果当前正在执行的程序收到它并终止,那么bash可以执行陷阱。与SIGTSTP相似,通过^ z; bash接收信号但是在正在运行的程序终止之前不执行陷阱,如果它采用默认行为并且被挂起则不会执行。尝试用简单的...替换read f并注意陷阱立即执行。