[Shell] swoole_timer_tick 与 crontab 实现定时任务和监控

时间:2021-09-21 21:44:35

 

手动完成 "任务" 和 "监控" 主要有下面三步:

 

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

 

Link:http://www.cnblogs.com/farwish/p/6230728.html