在做計劃任務的時候,可能由於某些問題,任務沒有執行完成,導致任務重複的運行,解決這個問題,只需要一個flock命令就可以了。
flock --help
flock (util-linux-ng 2.17.2)
Usage: flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command...
flock [-sxon][-w #] directory [-c] command...
-s --shared Get a shared lock #獲得一個共享鎖
-x --exclusive Get an exclusive lock #獲得一個獨佔鎖,這是默認的
-u --unlock Remove a lock #刪除一個鎖,通常是不需要的,因為在文件關閉時鎖會自動刪除
-n --nonblock Fail rather than wait #如果沒有立即獲得鎖,直接失敗而不是等待
-w --timeout Wait for a limited amount of time #如果沒有立即獲得鎖,等待指定時間
-o --close Close file descriptor before running command #在執行命令之前關閉保持鎖的文件描述符
-c --command Run a single command string through the shell #在shell中運行一個單獨的命令
-h --help Display this text #顯示幫助
-V --version Display version #顯示版本
例:
我要用rsync計劃任務做同步,寫了一個rsync同步腳本whsir.sh,設置了30分鐘同步一次服務端,但是可能由於其他某些因素導致,30分鐘內沒有同步完成,後台還會繼續執行此計劃任務,此時就能看到兩個rsync同步同時在跑,這時候我們就需要flock命令來解決問題了。
原來我的計劃任務:
*/30 * * * * /www/whsir.sh
使用flock後的計劃任務:
*/30 * * * * flock -xn /tmp/demo.lock -c /www/whsir.sh
這樣的話,當前計劃任務whsir.sh如果沒有運行完,下一個任務會判斷demo.lock被鎖定,直接失敗,等待下次在判斷。
原創部分:
==========如下是比較簡單的實驗==========
1.我們先創建一個叫做“flock-test.sh”的腳本,腳本內容為
#!/bin/bash
echo "This is a system flock test script"
echo "Sleeping 100 second"
sleep 100
2.使用“flock -xn /tmp/flock.lock ./flock-test.sh”命令執行這個腳本,結果可以看到,執行成功
3.重新打開一個終端界面,進入腳本目錄後繼續使用“flock -xn /tmp/flock.lock ./flock-test.sh”命令啓動腳本,可以看到腳本並沒有執行,而是直接退出了,為什麼呢?因為腳本第一次運行的時候在等待100秒沒有執行完成,他創建的鎖還沒有釋放,所以想要再次運行這個腳本的時候會直接退出了!
4.我們再來試一下-w參數,先把已經運行的腳本全部關閉掉,然後重新啓動一個腳本。
5.我們再第二個終端使用“flock -xw 5 /tmp/flock.lock ./flock-test.sh”命令啓動腳本。
第一種結果:不做任何操作,你會發現腳本並沒有立刻退出而是5秒鐘之後才會退出。
第二種結果:在等待期間強行結束掉第一個執行的腳本,你會發現處在等待狀態的腳本會開始運行(要在5秒等待期之內結束掉)
轉載於:https://blog.51cto.com/wangxiaoke/2299377