Ram*_*Ram 9 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
...
Run Code Online (Sandbox Code Playgroud)
我手动必须将KILL信号发送到进程.知道为什么会发生这种情况以及如何解决这个问题吗?
在当前正在执行的进程终止之前,shell不会执行陷阱.(至少,这是bash 3.00.15的行为).如果通过^ c发送SIGINT,它将被发送到前台进程组中的所有进程; 如果当前正在执行的程序收到它并终止,那么bash可以执行陷阱.与SIGTSTP相似,通过^ z; bash接收信号但是在正在运行的程序终止之前不执行陷阱,如果它采用默认行为并且被挂起则不会执行.尝试用...简单替换,read f并注意陷阱立即执行.
| 归档时间: |
|
| 查看次数: |
1679 次 |
| 最近记录: |