flock防止crontab腳本周期內未執行完重復執行(轉)


如果某腳本要運行30分鍾,可以在Crontab里把腳本間隔設為至少一小時來避免沖突。而比較糟的情況是可能該腳本在執行周期內沒有完成,接着第二個腳本又開始運行了。如何確保只有一個腳本實例運行呢?一個好用的方法是利用lockf(FreeBSD 8.1下為lockf,CentOS 5.5下為flock),在腳本執行前先檢測能否獲取某個文件鎖,以防止腳本運行沖突。

lockf的參數如下。

-k:一直等待獲取文件鎖。

-s:silent,不發出任何信息,即使拿不到文件鎖。

-t seconds:設定timeout的時間是seconds秒,如果超過時間,則自動放棄。

以下Crontab計划任務執行前,需獲取臨時文件create.lock的文件鎖,此項Crontab計划任務的內容如下:

 
        
  1. */10 * * * * (lockf -s -t 0 /tmp/create.lock /usr/bin/python /home/project/cron/create_tab.py  
  2. >> /home/project/logs/create.log 2>&1) 

若第一個實例在10分鍾內沒有運行完,第2個實例不會運行。我以前是通過Shell腳本來解決這個問題的,比如用while...do循環,然后放在后台執行。但后來發現其實用flock或lockf方法更為簡單。

 

==============================

 

crontab防止腳本周期內未執行完重復執行

個人體會: flock -xn my.lock commond
my.lock是一個文件,應該可以是任意文件,可以新建一個空文件
當flock 獲得鎖后就會執行后面的 commond
測試過程: $1: flock -xn my.lock sleep 20
              $2: flock -xn my.lock ls
只有當1返回后, 2的ls才會成功

crontab防止腳本周期內未執行完重復執行

 

如果某腳本要運行30分鍾,可以在Crontab里把腳本間隔設為至少一小時來避免沖突。而比較糟的情況是可能該腳本在執行周期內沒有完成,接着第 二個腳本又開始運行了。如何確保只有一個腳本實例運行呢?一個好用的方法是利用lockf(FreeBSD 8.1下為lockf,CentOS  5.5下為flock),在腳本執行前先檢測能否獲取某個文件鎖,以防止腳本運行沖突。

lockf的參數如下。

-k:一直等待獲取文件鎖。

-s:silent,不發出任何信息,即使拿不到文件鎖。

-t seconds:設定timeout的時間是seconds秒,如果超過時間,則自動放棄。

以下Crontab計划任務執行前,需獲取臨時文件create.lock的文件鎖,此項Crontab計划任務的內容如下:

1
* /10  * * * * (lockf -s -t 0  /tmp/create .lock  /usr/bin/python  /home/project/cron/create_tab .py  >>  /home/project/logs/create .log 2>&1)

 

若第一個實例在10分鍾內沒有運行完,第2個實例不會運行。我以前是通過Shell腳本來解決這個問題的,比如用while...do循環,然后放在后台執行。但后來發現其實用flock或lockf方法更為簡單。

 

附上linux下的flock的用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
flock (util-linux 2.13-pre7)
Usage: flock [-sxun][-w #] fd#
        flock [-sxon][-w #] file [-c] command...
   -s  --shared     Get a shared lock 
#共享鎖,在定向為某文件的FD上設置共享鎖而未釋放鎖的時間內,其他進程試圖在定向為此文件的FD上設置獨占鎖的請求失敗,而其他進程試圖在定向為此文件的FD上設置共享鎖的請求會成功
   -x  --exclusive  Get an exclusive lock 
#獨占或排他鎖,在定向為某文件的FD上設置獨占鎖而未釋放鎖的時間內,其他進程試圖在定向為此文件的FD上設置共享鎖或獨占鎖都會失敗。只要未設置-s參數,此參數默認被設置
   -u  --unlock     Remove a lock 
#手動解鎖,一般情況不必須,當FD關閉時,系統會自動解鎖,此參數用於腳本命令一部分需要異步執行,一部分可以同步執行的情況
   -n  --nonblock   Fail rather than wait 
#為非阻塞模式,當試圖設置鎖失敗,采用非阻塞模式,直接返回1,
   -w  --timeout    Wait  for  a limited amount of  time
#設置阻塞超時,當超過設置的秒數,就跳出阻塞,返回1
   -o  --close      Close file descriptor before running command
   -c  --command    Run a single command string through the shell 執行其后的comand
   -h  --help       Display  this  text
   -V  --version    Display version

舉個例子執行如下腳本:

每天23:30的時候執行一個腳本,但是執行前必須要獲得排他文件鎖,否則無法執行命令

1
30 23 * * * flock -xn  /tmp/test .lock -c  '/usr/local/php test.php'

==========================================================================

如果在crontab里有個定時任務設置為一分鍾執行一次,但是它執行的時間可能會超過一分鍾,此時crontab一分鍾后會再次運行該腳本,這樣就會出現沖突,如果程序不做容錯處理,可能會導致出現一些問題。如果想解決這個問題,可以用Linux中的進程鎖控制crontab執行的並發問題。

image

在crontab設置lock

*/5 * * * * /usr/bin/flock -xn /var/run/up_svn.lock -c'/scripts/up_svn.sh >/dev/null2>&1'

顯示如下:

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM