在 Linux 下使用 crontab 執行定時任務,若是任務自身運行時間超過任務執行的間隔時間,就有可能致使兩次任務發生衝突,請問如何控制前一個任務執行完後再啓動下一個任務?shell
加個文件鎖就OK了。每次任務執行時先判斷鎖文件是否存在,存在則退出任務,不存在則創建鎖文件,任務執行完畢時刪除該文件。在超出crontab執行的間隔時間的狀況下,若是你還想繼續執行以前沒有執行的任務,則須要在腳本中判斷當次任務執行時間,若是超過了crontab的間隔時間,那麼在當前任務結束時進行系統調用執行該定時任務。bash
flock使用ide
flock,建議性鎖,不具有強制性。一個進程使用flock將文件鎖住,另外一個進程能夠直接操做正在被鎖的文件,修改文件中的數據,緣由在於flock只是用於檢測文件是否被加鎖,針對文件已經被加鎖,另外一個進程寫入數據的狀況,內核不會阻止這個進程的寫入操做,也就是建議性鎖的內核處理策略。進程
-s, --shared: 得到一個共享鎖 crontab
-x, --exclusive: 得到一個獨佔鎖 it
-u, --unlock: 移除一個鎖,一般是不須要的,腳本執行完會自動丟棄鎖 class
-n, --nonblock: 若是沒有當即得到鎖,直接失敗而不是等待 test
-w, --timeout: 若是沒有當即得到鎖,等待指定時間 date
-o, --close: 在運行命令前關閉文件的描述符號。用於若是命令產生子進程時會不受鎖的管控 定時任務
-c, --command: 在shell中運行一個單獨的命令
[root@db52 tmp]# cat /tmp/test.sh
#!/bin/bash
echo "Hello World"
sleep 10
[root@db52 tmp]# crontab -l
#crond-id-001:time sync
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
#crond-id-002:test
* * * * * /usr/bin/flock -xn /tmp/test.lock -c "/bin/sh /tmp/test.sh" >/dev/null 2>&1