2012-10-10 89 views
8

我有一个bash脚本来挂载和卸载一个设备,它在它们之间执行一些读取操作。由于设备速度非常慢,该脚本需要大约15秒才能完成(安装需要至少5-6秒)。由于安装此设备可能会导致其他问题,因此我不希望此脚本中断。尽管如此,我可以正确处理SIGINT(Ctrl + c),但是当我尝试处理SIGTSTP(Ctrl + z)时,脚本会冻结。这意味着信号被捕获,但处理程序不运行。Bash脚本:无法正确处理SIGTSTP

#!/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

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

+0

这很有道理。所以这听起来像是除非你用脚本执行的所有二进制文件也按照你的方式处理,否则没有办法正确处理^ z。是对的吗? – Ram

+0

您可以在setsid下异步运行作业并等待它。例如:'setsid cmd&wait'而不是'cmd'。 –

+0

似乎这样做。感谢您的帮助!但只是好奇,这个过程在新的会议中不会停止吗? – Ram