避免 cron 程式重複執行

寫 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 就可以接上

既不浪費時間 又可以避免重複執行

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料