避免 cron 程式重複執行
2015 Sep 23 未分類
寫 cron 自動執行的時候
一直有個困擾
因為時間到
cron 就會把你指定的命令叫起來執行
程式被叫起來的中間
總是會有個時間間隔
間隔中
如果程式執行不完
cron 又會再把程式叫起來一次
然後越跑越多
就會出現事情搶著做 重複做 的問題
(資訊工程上叫做 Race Condition)
然後機器就會被拖垮
這可是大事情
其實很久以前就遇到這個問題
因為有念過資工
所以知道要弄 lock 或是 critical section 之類的
讓後續跑起來的程式去 check 這個 lock
如果還在跑 就放棄
自己寫有點麻煩
雖然有些 function 可以弄這些功能
但沒控制好還是有爆炸的可能
最近又遇到了一樣的狀況
想說查一下有沒有什麼新的作法
果然查到了
https://ma.ttias.be/prevent-cronjobs-from-overlapping-in-linux/
其實也不是什麼新方法
只是之前沒查到比較像樣的方法
文中提到三個方法
1. flock
2. pgrep
3. 自己寫 (用鎖檔案的方式)
其中 1 最簡單
原本的 cron 是這樣 (用一個 php 解譯器去跑一個 php 程式)
* * * * * /usr/bin/php /path/to/cron.php
你只要改成這樣
* * * * * /usr/bin/flock -w 0 /path/to/cron.lock /usr/bin/php /path/to/cron.php
/path/to/cron.lock <= 這個是一個 lock 的檔案
2比較麻煩 (就不介紹了)
3自己寫更麻煩
會這招以後
你就可以把 cron 的時間設定密集一點
如果上一個工作一做完
下一個 cron 就可以接上
既不浪費時間 又可以避免重複執行