Linux cron 中腳本執(zhí)行超時限定和互斥配置
場景
- 假設(shè)有一個 PHP 腳本用來發(fā)送郵件,使用 Linux cron 每分鐘執(zhí)行一次幔托;
- 為闡明使用方式-暫不引入隊列系統(tǒng)穴亏,其實使用隊列處理此方式更優(yōu);
- 例如基本的配置如下
* * * * * php /home/app/email.php
可能存在的問題
- 如果這個郵件服務(wù)出現(xiàn)異常重挑,進(jìn)程僵死如何處理嗓化?
假設(shè)由于未知因素, email.php 腳本一直執(zhí)行谬哀,沒有退出蟆湖。極端的情況,進(jìn)入一個 while 死循環(huán)玻粪。
原本一分鐘執(zhí)行一次,現(xiàn)在僵死后面的腳本也無法執(zhí)行
解決辦法:
- 使用 timeout诬垂,假設(shè)我們設(shè)定每個腳本最多執(zhí)行時間位 200秒劲室,超過 200秒 就自動 kill。
* * * * * timeout 200 php /home/app/email.php
- 如果這個腳本執(zhí)行時間超過 60秒结窘,下一分鐘又會執(zhí)行 php email.php很洋,如果避免重復(fù)執(zhí)行?
這樣會出現(xiàn)隧枫,有兩個進(jìn)程同時在執(zhí)行 php email.php喉磁,會不會出現(xiàn)同一個任務(wù)被執(zhí)行了兩次谓苟?
解決辦法:
- 使用 flock 進(jìn)行互斥控制
- flock 命令參考
用法:
flock [選項] <文件|目錄> <命令> [<參數(shù)>...]
flock [選項] <文件|目錄> -c <命令>
flock [選項] <文件描述符號碼>
通過 shell 腳本管理文件鎖。
選項:
-s, --shared 獲取共享鎖
-x, --exclusive 獲取排他鎖(默認(rèn))
-u, --unlock 移除鎖
-n, --nonblock 失敗而非等待
-w, --timeout <秒> 等待限定的時間
-E, --conflict-exit-code <數(shù)字> 沖突或超時后的退出代碼
-o, --close 運(yùn)行命令前關(guān)閉文件描述符
-c, --command <命令> 通過 shell 運(yùn)行單個命令字符串
-F, --no-fork 執(zhí)行命令時不 fork
--verbose 增加詳盡程度
-h, --help display this help
-V, --version display version
* * * * * flock -xn /tmp/test.lock -c "timeout 200 php /home/app/email.php"
* * * * * flock -xn /tmp/test.lock -c "timeout 200 php /home/app/email.php >> /home/log/test.log 2>&1"
* * * * * flock -xn /tmp/test.lock -c "timeout 200 php /home/app/email.php >> /home/log/test.log 2>&1"