2014-06-10 246 views
2

我有一個bash腳本,它可以轉發到其他shell腳本和python腳本的混合。如果這些腳本中的任何一個失敗,或者用戶取消腳本(CTRL + C),我想在所有情況下執行一些清理。Bash腳本退出清理

許多用戶可以在同一個操作系統用戶下的SSH框中啓動並啓動構建。這是我們的構建服務器。該腳本需要編寫一個「build.lock」文件或其他東西,無論何時腳本退出(錯誤,用戶退出等)時都會清理它。如果腳本在第一個執行完成之前再次運行,它應該檢查「build.lock」文件並拒絕繼續。

我假設這是防止腳本並行執行的最佳方法。我們在Ubuntu上使用Bash。下面是腳本本身:

#!/bin/bash -e 
pushd build-server-scripts > /dev/null 
./build.sh "[email protected]" 
popd > /dev/null 

我的想法是一個很好的解決這個問題的方法嗎?如果是這樣,那麼執行它的方式是什麼?如果不是,每個人都會推薦哪些其他想法?我對Bash腳本沒有經驗,所以我隨時學習。

+0

我沒有時間在此刻一個完整的答案,但[文件](HTTP:// Linux操作系統。 die.net/Bash-Beginners-Guide/sect_12_02.html)在12.2.3.2似乎完全做你正在做的事情。祝你好運! –

回答

2

如果我正確理解你的問題,你可能要考慮bash的trap 您可以定義一個在腳本退出稱爲告警功能

# Set up a cleanup function to be triggered upon script exit 
__cleanup() 
{ 
    [[ -f "build.lock" ]] && rm "build.lock" 
} 

trap __cleanup EXIT 
1

當使用陷阱,不要忘記接收到的信號傳播調用進程:

__cleanup() 
{ 
    SIGNAL=$1 

    [[ -f "build.lock" ]] && rm "build.lock" 

    # when this function was called due to receiving a signal 
    # disable the previously set trap and kill yourself with 
    # the received signal 
    if [ -n "$SIGNAL" ] 
    then 
     trap $SIGNAL 
     kill -${SIGNAL} $$ 
    fi 
} 

陷阱將被稱爲像這樣在這種情況下:

trap '__cleanup 1' HUP 
trap '__cleanup 2' INT 
trap '__cleanup 3' QUIT 
trap '__cleanup 13' PIPE 
trap '__cleanup 15' TERM 

的適當的信號處理一個很好的解釋可以在這裏找到:

Proper handling of SIGINT/SIGQUIT