2013-11-24 71 views
2

我想在拿到SIGSTOP CTRL +ž信號我的腳本的trapShell腳本獲得CTRL + Z與陷阱

當我的腳本執行時,如果我暫時中止執行,發送SIGSTOP信號CTRL +ž,它需要刪除我在它創建的文件,並殺死的執行。

我不明白爲什麼下面的腳本不起作用。但更重要的是,做到這一點的正確方法是什麼?

#!/bin/bash 

DIR="temp_folder" 
trap "rm -r $DIR; kill -SIGINT $$" SIGSTP 

if [ -d $DIR ] 
then 
    rm -r $DIR 
else 
    mkdir $DIR 
fi 
sleep 5 

編輯

SIGSTOP不能被捕獲,但SIGTSTP可被捕獲,並從我searching on the internet後理解和發送信號時CTRL它下面的答案是正確的陷阱+ Z。但是,當我按下CTRL + Z而運行腳本它會卡住,這意味着腳本將無限地執行,無論我以後發送什麼信號。 enter image description here

回答

3

有兩個信號,你不能trap *,SIGKILLSIGSTOP。使用另一個信號。

*:沒有修改內核

IEEE standard

設置爲SIGKILL或SIGSTOP產生不確定的結果的陷阱。

+0

好吧,這是可以理解的。但是爲什麼不用'SIGTSTP'呢?並在編輯中獲得輸出? –

2

這裏的問題是您正在嘗試暫停已在睡眠的進程。

在shell腳本中使用DIR=$(mktemp -d)來創建臨時目錄也是一種很好的做法。

CTRL - Ç是信號(2)/ CTRL - ž20):

catch_exits() { 
     printf "\n$(basename $0): exiting\n" 1>&2 
     rm -rf $DIR 
     exit 1 
} 

trap catch_exits 1 2 3 15 20 

DIR="$(mktemp -d)" 
read -p "not sleeping" test 

如果發送功能到後臺(諸如用於光標微調) - 那麼你需要禁用CTRL - Z而長時間運行的是:

trap "" SIGTSTP