2012-10-10 88 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