2013-10-15 101 views
1

我有的通過cron設置爲運行每隔5min bash腳本......有次下一個5分鐘來,最後一個仍在運行。如果cron試圖運行它時停止腳本的最好方法是什麼?計劃的Cron - 重疊

貌似加入這樣的事情https://stackoverflow.com/a/12706574/800592到我的bash腳本會做的伎倆的開始?

我沒有得到什麼代碼試圖做雖然和我的腳本的正確語法會是什麼?

... 
The third form is convenient inside shell scripts, and is usually used 
     the following manner: 

     (
     flock -n 9 || exit 1 
     # ... commands executed under lock ... 
     ) 9>/var/lock/mylockfile 
... 

也許這樣的事情也會起作用?

flock -n -e 200 || exit 1 

回答

1

你爲什麼不嘗試這樣的事:

#!/bin/bash 
# Check whether lock file exists 
if [ -e /tmp/mylockfile ]; then 
    echo "Still running, exiting" 
    exit 
fi 

# Create a lock 
touch /tmp/mylockfile 

# Do stuff... 

# Clean up 
rm /tmp/mylockfile 

這是一個小更復雜:

#!/bin/bash 

# Check whether lock file exists 
iter=0 
while [ -e /tmp/mylockfile ]; do 
    if [ $((iter++)) -ge 60 ]; then 
    echo "Timeout, exiting" 
    exit 
    fi 
    sleep 1 
done 

# Create a lock 
touch /tmp/mylockfile 

# Do stuff... 

# Clean up 
rm /tmp/mylockfile 

的循環等待60秒被刪除鎖文件。 ..

+0

我認爲你可能需要考慮更嚴肅的重新設計。考慮一下,如果由於某種原因腳本開始需要6分鐘才能完成,會發生什麼情況。然後第二次迭代遲到1分鐘,這意味着第三次迭代遲到2分鐘等等,直到很快你有幾百個副本在等待運行,並且爭奪鎖定(但是你實現它),只要一次迭代是目前正在運行釋放它... – twalberg

+0

JUP,我知道......你需要更多的邏輯來處理這些情況。但這僅僅是一個例子,而不是一個完整的調度解決方案。我個人會使用第一個例子,我可能會錯過一些週期,但它非常強大... –

+0

我同意,第一個例子適合我 – Tony

0

flock管理從腳本文件鎖定。命令行參數-n意味着羊羣會後,如果文件不能被鎖定失敗,所以命令||在這種情況下,將調用。在你的例子中,數字是文件描述符,用於訪問在命令結尾處定義的文件。您應該使用足夠高的數字,以免干擾您在shell腳本中使用的其他文件。使用>>><將文件分配給文件描述符。如果您使用>>>文件將會爲您創建的,但你需要寫權限。如果您使用<文件必須存在,但您只需要讀取權限。你在flock -n 9 ||之後編寫腳本代碼退出1行。