2011-09-09 169 views
2

bash腳本如何確保不超過一個副本運行?bash腳本如何確保不超過一個副本運行?

我曾嘗試:

ps -ef| grep /user/loca/shell/sh | wc -l 

這顯示了我2因爲grep命令。將其更改爲:

ps -ef | grep /user/loca/shell/sh | grep -v 'grep' wc -l 

那麼它的節目。然而,如果我再vim /user/loca/shell/sh,然後執行:

ps -ef| grep /user/loca/shell/sh | grep -v 'grep' wc -l 

顯示2.但是,只有一個過程,我已經開始。

bash腳本如何檢查進程是否正在運行?

+0

爲/用戶/ LOCA /殼/ sh的腳本或編譯的可執行文件?我懷疑你需要更仔細地搜索ps輸出。請在運行和編輯時顯示ps輸出。 –

+0

是的,他們正在運行和執行... – joe

+0

請顯示ps輸出 –

回答

7

Unix守護進程中經常使用的慣用法是在啓動時創建一個帶有PID的文件。

然後,您可以在啓動時檢查文件的存在和/或內容,如果存在,則退出並保持該實例運行。

在腳本結尾刪除文件,準備下次運行。

唯一的問題出現在腳本運行時,但由於某種原因沒有完成,導致PID文件存在。這可以通過檢查它的時間戳來處理,如果它太早以前,你認爲它是一箇中止運行並繼續當前運行。

+1

刪除文件使用'trap'rm $ PID_FILE「EXIT」 –

+1

而不是不可靠的pid文件時間戳方法,更好的方法是檢查pid是否正在使用並匹配腳本名稱。 – jlliagre

+1

此外,守護進程可以檢查記錄在PID文件中的進程是否仍然存在。如果過程PID存在,'kill -0 PID 2>/dev/null'命令將報告成功,否則將失敗。 –

0

嘗試p纖ep,而不是在你的腳本「PS -ef ...」:

pgrep /usr/loca/shell/sh 

如果這是行不通的話,我會訴諸試圖通過創建腳本的符號鏈接鎖如果還沒有存在,如果它已經存在,則退出並在退出時刪除它。創建符號鏈接是unix上的一項原子操作,可用作窮人對shell腳本的鎖定。

0

我用一個文件鎖:

MY_LOCK_FILE='whatever.lock' 

(if (flock -nx 200); then 
     # Do stuff here... 
    fi 
) 200>"$MY_LOCK_FILE"