1. 程式人生 > >[Shell] swoole_timer_tick 與 crontab 實現定時任務和監控

[Shell] swoole_timer_tick 與 crontab 實現定時任務和監控

ash crontab usr 當前 gif nohup AR 定時器 kill -9

手動完成 "任務" 和 "監控" 主要有下面三步:

1. mission_cron.php(定時自動任務腳本):

技術分享圖片
<?php
/**
 * 自動任務 定時器 (5s 執行).
 *
 * swoole_timer_tick 解決秒級定時;
 * 如需調整,註意配置路徑 和 mission_cron_monitor.
 *
 * Daemon Run:
 *  ./mission_cron_monitor
 *
 * Foreground Run:
 *  php mission_cron.php
 *
 * Stop:
 *  kill -9 PID
 *
 * @farwish.com
 */

swoole_timer_tick(5000, function() {
    // 查詢結果
    // 事務性更新
    // 記錄日誌
    // 輸出結果
}
技術分享圖片

2. mission_cron_monitor (由 crontab 運行,監控上述腳本):

技術分享圖片
#/bin/bash
# 監控定時器,斷掉重啟.
#
# crontab used in /var/spoor/cron/
# ( crontab -e )
#
# @farwish.com

phpbin=/usr/local/php7/bin/php
curdir=`dirname $0` 
script=${curdir}/mission_cron.php
process=`ps aux | grep -v grep | grep ${script}`

if test -z "$process"; then
    nohup ${phpbin} ${script} > /dev/null 2>&1 &
fi
技術分享圖片

這裏 curdir 沒有使用 `pwd`,原因在於 pwd 獲取的是當前所在工作目錄,非執行的腳本所在目錄,你可以通過 man 獲得詳細解釋。

  pwd - print name of current/working directory

  dirname - strip last component from file name

nohup的作用在於不受終端掛斷影響,配合 & 後臺運行,完美實現了 daemon.

3. 設置用戶級 cron 腳本.

# 用戶級運行cron.
# 分 時 日 月 周 命令
# @farwish.com

# 每分鐘執行
*/1 * * * * /home/www/project/mission_cron_monitor

完成以上三步,主要工作就完了,可以運行查看效果了;

重申:mission_cron.php 任務不一定要包在 swoole_timer_tick 回調函數內,僅在執行 秒/毫秒 定時需要。

腳本雖然簡單,但是有一些問題需要當心,如下:

1. 排錯:任務有沒有執行通過看日誌 /var/log/cron 是否有執行記錄,

     有執行的話就是腳本問題,語法錯誤或者其它。註意,腳本中一律使用絕對路徑。

2. 級別:系統級任務 /ect/crontab

     用戶級任務 直接用 crontab -e 編輯(存放位置 /var/spoor/cron/weichen)

     程序級任務 swoole_timer_tick(1000, function() {});

3. 選項:crontab -e

     crontab -l # 當前用戶擁有的 cron

     crontab -r # 刪除當前用戶的 cron

     crontab -ri # 刪除前先詢問

  更多 crontab -h

[Shell] swoole_timer_tick 與 crontab 實現定時任務和監控