[Shell] 实战: swoole_timer_tick 与 crontab 实现定时任务和监控
手动完成 "任务" 和 "监控" 主要有下面三步:
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
Refer:Swoole鸡肋吗