2011-08-14 31 views
16

用於防止cron工作從併發運行下面的鎖機制:直到第一個完成慶典羣:退出如果不能獲得鎖

#!/bin/bash 

echo "Before critical section" 
(
    flock -e 200 
    echo "In critical section" 
    sleep 5 
) 200>/tmp/blah.lockfile 
echo "After critical section" 

當運行兩個實例在一起,後來的等待,和然後運行。這可能會導致腳本積壓等待運行。

如何更改此腳本,以便如果flock無法獲取該鎖,它會終止該腳本?我試過-n沒有成功。

回答

20
flock -n -e 200 || exit 1 

flock -n通過返回失敗代碼(非零值)告訴您失敗。您可以在腳本的頂部執行set -e,以便在發現任何未檢查的錯誤時退出。

根據您的應用程序,您可能希望exit 0在無法獲取鎖定時指示成功。

12

我們對腳本文件本身使用排他鎖,$0是命令文件的名稱。

exec 200<$0 
flock -n 200 || exit 1 

整個解決方案有兩行代碼。但訣竅是打開$ 0讀取,然後獲得獨佔鎖定。

+2

如果發生這種情況可能會失敗,那將很好。如果'$ 0'包含空格,我懷疑它會失敗,如果'$ 0'沒有包含正在運行的腳本的路徑(例如腳本在其他地方,但在PATH上),它將失敗。 – joeytwiddle

+0

$ 0應該仍然有路徑,如果它在$ PATH。不起作用的一種情況是在短劃線之下。 – steveayre