2013-07-07 38 views
1

我寫了一個名爲「wp」的bash腳本,它將文件上傳到ftp服務器。它使用wput實用程序。它從文本文件中獲取文件列表。上傳完成後,它會在文本文件中用雙十字線註釋掉該行。根據日誌文件中的最後一行檢測上載是否成功。我的問題是如何避免多次啓動我的腳本?我想,如果在實例運行與p纖ep檢測,但不能正常工作:如何避免多次啓動bash腳本?

#!/bin/bash 

if [ "$(pgrep ^wp$|wc -l)" -eq "2" ] 

then 
    echo "$(pgrep ^wp$)" 
    echo "$(pgrep ^wp$|wc -l)" 
    echo "wp script is starting..." 
else 
    echo "$(pgrep ^wp$)" 
    echo "$(pgrep ^wp$|wc -l)" 
    echo "wp script is already running!" 
    exit 
fi 

server="ftp://username:[email protected]" 
logfile=~/uploads.log 
listfile=~/uploads.txt 
list_backup=~/uploads_bak000.txt 

while read f; 
do 
ret="" 

if [ "${f:0:1}" = "#" -o "$f"1 = 1 ] 
then 
    if [ "$f"1 = 1 ] 
    then 
    : 
    #echo "invalid string: "$f 
    else 
    #first character is remark sign # then empty command -> : 
    echo "remark line skipped: "$f 
    fi 
else 
    #while string $ret is empty 
    while [ -z "$ret" ] 
    do 
    wput "$f" --tries=-1 "$server" 2>&1|tee -a $logfile #> /dev/null 
    ret=$(tail -n 1 "$logfile"|grep "FINISHED\|Nothing\|Skipped\|Transfered") 
    done 
    if [ -n "$ret" ] 
    then 
    cat $listfile > $list_backup 
    awk -v f="$f" '{if ($0==f && $0!~/#/) print "#" $0; else print $0;}' $list_backup > $listfile 
    fi 
fi 
done < $listfile 

回答

2

有快速正骯髒的解決方案,用ps使用grep(不這樣做)。

最好使用鎖定文件作爲「互斥量」。這樣做的好方法是將目錄用作鎖定文件(http://mywiki.wooledge.org/BashFAQ/045)。

我也建議考慮看看: http://mywiki.wooledge.org/ProcessManagement#How_do_I_make_sure_only_one_copy_of_my_script_can_run_at_a_time.3F ,其中提到使用setlockhttp://cr.yp.to/daemontools/setlock.html)抽象鎖定文件爲你辦理。

+0

Thx,使/ tmp中的一個emtpy目錄解決了問題。我認爲它必須在我的腳本結尾被刪除,但是如果我的腳本被Ctrl + C中止並且我想重新啓動它,會發生什麼?由於存在鎖定目錄,它不會啓動。 – Konstantin

+0

@Konstantin,你需要閱讀BashFAQ鏈接,答案就在那裏。 –

+1

@Konstantin:您需要使用trap命令確保在捕獲信號後執行rm。但正如格倫所說:請閱讀BashFAQ的其餘部分。它包括其他寶石,例如一個很好的解釋,說明爲什麼你會選擇mkdir而不是其他方法,提及剩下的需要考慮的陳舊鎖定風險(如果是kill -9)和「flock」,如果你可以使用在Linux上。 – kamjagin