我有一个 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 信号。知道为什么会发生这种情况以及如何解决它吗?
在当前正在执行的进程终止之前,shell 不会执行陷阱。 (至少,这是 bash 3.00.15 的行为)。如果通过^c发送SIGINT,则会发送到前台进程组中的所有进程;如果当前执行的程序接收到它并终止,则 bash 可以执行陷阱。与通过 ^z 的 SIGTSTP 类似; bash 接收到信号,但不会执行陷阱,直到正在运行的程序终止,如果它采用默认行为并被挂起,则不会执行陷阱。尝试更换...
用一个简单的read f
并注意陷阱立即执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)