Linux cron 中指令碼執行超時限定和互斥配置
Linux cron 中指令碼執行超時限定和互斥配置
場景
- 假設有一個 PHP 指令碼用來發送郵件,使用 Linux cron 每分鐘執行一次;
- 為闡明使用方式-暫不引入佇列系統,其實使用佇列處理此方式更優;
- 例如基本的配置如下
* * * * * php /home/app/email.php
可能存在的問題
-
如果這個郵件服務出現異常,程序僵死如何處理?
假設由於未知因素, email.php 指令碼一直執行,沒有退出。極端的情況,進入一個 while 死迴圈。
原本一分鐘執行一次,現在僵死後面的指令碼也無法執行
解決辦法:
- 使用 timeout,假設我們設定每個指令碼最多執行時間位 200秒,超過 200秒 就自動 kill。
* * * * * timeout 200 php /home/app/email.php
-
如果這個指令碼執行時間超過 60秒,下一分鐘又會執行 php email.php,如果避免重複執行?
這樣會出現,有兩個程序同時在執行 php email.php,會不會出現同一個任務被執行了兩次?
解決辦法:
- 使用 flock 進行互斥控制
- flock 命令參考
用法: flock [選項] <檔案|目錄> <命令> [<引數>...] flock [選項] <檔案|目錄> -c <命令> flock [選項] <檔案描述符號碼> 通過 shell 指令碼管理檔案鎖。 選項: -s, --shared獲取共享鎖 -x, --exclusive獲取排他鎖(預設) -u, --unlock移除鎖 -n, --nonblock失敗而非等待 -w, --timeout <秒>等待限定的時間 -E, --conflict-exit-code <數字>衝突或超時後的退出程式碼 -o, --close執行命令前關閉檔案描述符 -c, --command <命令>通過 shell 執行單個命令字串 -F, --no-fork執行命令時不 fork --verbose增加詳盡程度 -h, --helpdisplay this help -V, --versiondisplay 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"