文档章节

linux crontab实现每秒执行的两种方法

ZYallers
 ZYallers
发布于 2017/07/21 15:27
字数 1070
阅读 1
收藏 0

linux crontab实现每秒执行的两种方法

image

Linux crontab 命令,最小的执行时间是一分钟。如需要在小于一分钟内重复执行,可以有两个方法实现。

一、使用延时来实现每N秒执行

在CI框架下创建一个方法做执行动作。该方法从redis队列里弹出元素,然后批量写入数据库。

/**
 * 访问数据入库,只允许cli命令行运行,默认每次插入30条数据,从redis list中弹出获取数据,crontab由运维设置
 * @param int $rows 每次插入数据条数
 */
public function logAccess($rows = 30)
{
    !is_cli() && exit(header("HTTP/1.1 403 Forbidden"));
    try {
        $curTime = date('Y-m-d H:i:s');
        $redis = $this->getRedis();
        $rdsKey = $this->getCI()->config->item(self::RDS_WEIGHT_DRAW_ACCESS_LIST);
        $len = $redis->lLen($rdsKey);
        !$len > 0 && exit("{$curTime}->List empty.\n");
        $data = array();
        $continue = true;
        $count = 0;
        while ($continue) {
            $count++;
            $json = $redis->rPop($rdsKey);
            if (!empty($json)) {
                array_push($data, json_decode($json, true));
            }
            if (!$json || $count > $rows - 1) {
                $continue = false;
            }
        }
        empty($data) && exit("{$curTime}->Data empty.\n");
        $res = DialAccessLog_model::getInstance()->insertBatchAccessLog($data);
        if (!$res) {
            /* 写入数据库失败则重新入队列 */
            foreach ($data as $key => $value) {
                $redis->lPush(json_encode($value));
            }
            exit("{$curTime}->Into table failed, rolled back. llen:" . $redis->lLen($rdsKey) . ".\n");
        }
        exit("{$curTime}->Into table ".count($data)." data, llen:" . $redis->lLen($rdsKey) . ".\n");
    } catch (Exception $e) {
        exit("{$curTime}->" . $e->getMessage() . "\n");
    }
}

crontab -e 输入以下语句,然后 :wq 保存退出。

* * * * * source /apps/sh/.server_env.sh;/apps/svr/php/bin/php -c /apps/conf/php/php.ini -f  /apps/data/work/php/act.hxsapp.cc/index.php weightDraw/Stat logAccess/30 > /tmp/act_wdraw_accesslog_rds_list.log 2>&1
* * * * * sleep 10; source /apps/sh/.server_env.sh;/apps/svr/php/bin/php -c /apps/conf/php/php.ini -f  /apps/data/work/php/act.hxsapp.cc/index.php weightDraw/Stat logAccess/30 > /tmp/act_wdraw_accesslog_rds_list.log 2>&1 
* * * * * sleep 20; source /apps/sh/.server_env.sh;/apps/svr/php/bin/php -c /apps/conf/php/php.ini -f  /apps/data/work/php/act.hxsapp.cc/index.php weightDraw/Stat logAccess/30 > /tmp/act_wdraw_accesslog_rds_list.log 2>&1
* * * * * sleep 30; source /apps/sh/.server_env.sh;/apps/svr/php/bin/php -c /apps/conf/php/php.ini -f  /apps/data/work/php/act.hxsapp.cc/index.php weightDraw/Stat logAccess/30 > /tmp/act_wdraw_accesslog_rds_list.log 2>&1
* * * * * sleep 40; source /apps/sh/.server_env.sh;/apps/svr/php/bin/php -c /apps/conf/php/php.ini -f  /apps/data/work/php/act.hxsapp.cc/index.php weightDraw/Stat logAccess/30 > /tmp/act_wdraw_accesslog_rds_list.log 2>&1
* * * * * sleep 50; source /apps/sh/.server_env.sh;/apps/svr/php/bin/php -c /apps/conf/php/php.ini -f  /apps/data/work/php/act.hxsapp.cc/index.php weightDraw/Stat logAccess/30 > /tmp/act_wdraw_accesslog_rds_list.log 2>&1

使用 tail -f 查看执行情况,可以见到log每10秒被写入一条记录。

fdipzone@ubuntu:~$ tail -f /tmp/act_wdraw_accesslog_rds_list.log
2017-05-24 15:10:01->Into table 1 data, llen:0.
2017-05-24 15:10:11->List empty.
2017-05-24 15:11:21->List empty.
2017-05-24 15:11:31->Into table 1 data, llen:0.
2017-05-24 15:12:41->List empty.
2017-05-24 15:12:51->Into table 5 data, llen:0.
2017-05-24 15:13:01->List empty.
2017-05-24 15:13:21->Into table 2 data, llen:0.
2017-05-24 15:13:31->List empty.
2017-05-24 15:13:41->List empty.
2017-05-24 15:13:51->Into table 2 data, llen:0.

原理:通过延时方法sleep N来实现每N秒执行。

注意:

60必须能整除间隔的秒数(没有余数),例如间隔的秒数是2,4,6,10,12等。 如果间隔的秒数太少,例如2秒执行一次,这样就需要在crontab 加入60/2=30条语句。不建议使用此方法,可以使用下面介绍的第二种方法。

二、编写shell脚本实现

act_wdraw_accesslog_rds_list.sh

#!/bin/bash
phpexec=/apps/svr/php/bin/php
phpini=/apps/conf/php/php.ini
index_file=/apps/data/work/php/act.hxsapp.cc/index.php
env_sh=/apps/sh/.server_env.sh
step=2
source $env_sh;
for (( i=0; i<60; i=(i+step) )); do
  $($phpexec -c $phpini -f $index_file weightDraw/Stat logAccess/30 >> /tmp/act_wdraw_accesslog_rds_list.log 2>&1)
  sleep $step
done
exit 0

crontab -e 输入以下语句,然后:wq 保存退出。

* * * * * /apps/sh/act_wdraw_accesslog_rds_list.sh

使用 tail -f 查看执行情况,可以见到log每2秒执行一次。

2017-05-24 15:10:01->Into table 1 data, llen:0.
2017-05-24 15:10:03->List empty.
2017-05-24 15:11:05->List empty.
2017-05-24 15:11:07->Into table 1 data, llen:0.
2017-05-24 15:11:09->List empty.
2017-05-24 15:11:11->Into table 5 data, llen:0.
2017-05-24 15:11:13->List empty.
2017-05-24 15:11:15->Into table 2 data, llen:0.
2017-05-24 15:11:17->List empty.
2017-05-24 15:11:19->List empty.
2017-05-24 15:11:21->Into table 2 data, llen:0.

原理:在sh使用for语句实现循环指定秒数执行

注意:

如果60不能整除间隔的秒数,则需要调整执行的时间。例如需要每7秒执行一次,就需要找到7与60的最小公倍数,7与60的最小公倍数是420(即7分钟)。 则act_wdraw_accesslog_rds_list.sh step的值为7,循环结束条件i<420, crontab -e可以输入以下语句来实现

*/7 * * * * /apps/sh/act_wdraw_accesslog_rds_list.sh

© 著作权归作者所有

共有 人打赏支持
ZYallers
粉丝 1
博文 59
码字总数 19100
作品 0
佛山
程序员
Linux crontab 实现每秒执行

linux crontab 命令,最小的执行时间是一分钟。如需要在小于一分钟内重复执行,可以有两个方法实现。   1.使用延时来实现每N秒执行   创建一个php做执行动作,非常简单,就是把当前时间写...

mac_zhao
2014/11/27
0
0
使用Spring3+Quartz实现定时任务

在本文中,我们使用Spring3+Quartz实现定时任务。spring中定义了一些接口来支持Quartz,可以使你的业务逻辑类和Quartz解耦。 这个例子中使用了如下maven的依赖项: <dependencies> <!-- Spri...

巴顿
2014/01/10
0
0
PHP5计划任务离线功能的原理

为了定时更新某一文件,需要程序自动运行,从网上搜到了两种方法:ignoreuserabort() 和crontab ignoreuserabort()函数搭配settimelimit(0)和sleep($interval)即可实现程序自动运行更新,下面...

五味格子
2011/05/11
0
0
linux下定时执行python脚本方法

方法有两种: 法 一 nohup python xxx.py >> xx.log 2>&1 & 法 二 用linux自带的crontab 第一步 加入需要执行的脚本 执行 crontab -e * python 路径/xxx.py 保存重启 /etc/init.d/cron resta......

疯子张
2014/08/19
0
0
linux中Cron定时任务系统命令详解

linux中Cron定时任务系统命令详解 分类:Linux VPS教程 作者:阿川 发布时间:October 13, 2011 有很多同学在购买VPS之后,需要用到计划任务.但是又对计划任务不太了解,所以.今天我们的帮助中...

legend3
2014/07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《Netkiller Java 手札》· 二进制文件操作大全

本文节选自《Netkiller Java 手札》 Netkiller Java 手札 Mr. Neo Chan, 陈景峯(BG7NYT) 中国广东省深圳市望海路半岛城邦三期 518067 +86 13113668890 <netkiller@msn.com> $Id: book.xml 6......

netkiller-
18分钟前
1
0
Fiddler Debugger post请求

常用的两种: 第一种默认的 对应URL为www 的要用请求头为:Content-Type: application/x-www-form-urlencoded 请求参数为 :param1=1234¶m2=12345 注:有些接口是指定用这种的第二方式并不...

轻量级赤影
25分钟前
2
0
如何搭建母婴亲子类知识社区

近期社交领域融资动作频繁,海尔高管、海尔医疗有限公司总裁管礼庆创办的母婴知识分享社区平台Alwayslove于上月获得700万天使轮融资。 Alwayslove是一个母婴知识分享社区平台,采用UGC模式,...

ThinkSNS账号
27分钟前
1
0
Android 自定义构建类型 BuildType

最近接触到自定义构建类型 BuildType,发现这一块有些地方稍不注意的话会被绕进去浪费点时间,既然我这边已经花费时间了,如果正好你也需要接触到 BuildType,也许接下来分享的 tips 可能会帮...

猴亮屏
28分钟前
1
0
美团点评基于 Flink 的实时数仓建设实践

引言 近些年,企业对数据服务实时化服务的需求日益增多。本文整理了常见实时数据组件的性能特点和适用场景,介绍了美团如何通过 Flink 引擎构建实时数据仓库,从而提供高效、稳健的实时数据服...

美团技术团队
31分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部