9

我有一个安装和卸载设备的 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 信号。知道为什么会发生这种情况以及如何解决吗?

4

1 回答 1

6

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

于 2012-10-10T17:29:16.993 回答