crontab防止指令碼週期內未執行完重複執行

2021-07-07 06:15:10 字數 2219 閱讀 4923

八月 28, 2015 ( no comments )

個人體會:  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才會成功

如 果某指令碼要執行30分鐘,可以在crontab裡把指令碼間隔設為至少一小時來避免衝突。而比較糟的情況是可能該指令碼在執行週期內沒有完成,接著第 二個指令碼又開始執行了。如何確保只有乙個指令碼例項執行呢?乙個好用的方法是利用lockf(freebsd 8.1下為lockf,centos  5.5下為flock),在指令碼執行前先檢測能否獲取某個檔案鎖,以防止指令碼執行衝突。

lockf的引數如下。

-k:一直等待獲取檔案鎖。

-s:silent,不發出任何資訊,即使拿不到檔案鎖。

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

以下crontab計畫任務執行前,需獲取臨時檔案create.lock的檔案鎖,此項crontab計畫任務的內容如下:

*/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的用法:

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 thistext

-v  --version    display version

舉個例子執行如下指令碼:

每天23:30的時候執行乙個指令碼,但是執行前必須要獲得排他檔案鎖,否則無法執行命令

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

使用crontab執行指令碼週期性獲取系統資訊

1.crontab準備 1 安裝服務 sudo apt install cron2 開通並開啟後台服務 sudo systemctl enable cron.service sudo systemctl start cron.service3 建立乙個crontab檔案 sudo vim mycro...

unity3d 指令碼週期函式

1,編輯器階段 2,場景第一次載入階段 3,第一幀更新之前的階段 awake之後,update之前 以上三個方法,即awake,onenable,start完成了乙個unity指令碼的初始化工作。5,更新順序 指令碼更新的邏輯在三個定義的更新方法中實現,分別是update,fixupdate,lat...

unix週期執行指令Crontab命令

鏈結 主要內容 簡單解釋一下 crontab e 編輯,類似 vim,儲存退出時會檢查語法 l 列舉所有任務 r 刪除所有任務 如果 crontab 執行出錯,可以檢視日誌檔案 var log syslog 基本語法 min表示分鐘,範圍 0 59 hour表示小時,範圍 0 23 day表示天,範...