docker下计划任务crontab的使用方法[python]

今天聊下在docker怎么合理的使用crontab 。 

一直没有注意在docker如何使用crontab计划任务,我曾经已经不能用,所以用的是dockerfile定义的启动脚本,里面含有一个while的循环逻辑。 

Docker crontab的使用 , http://xiaorui.cc/?p=1875

下面是一个简单的Dockerfile文件

#xiaorui.cc
#拉取镜像
FROM wowuwowuwo/spider_base

COPY ./spider /data/buzzMaster

# Define working directory.
WORKDIR /data/buzzMaster/

# Clean up
RUN rm -rf /tmp/*

ENTRYPOINT ["/data/buzzMaster/entrypoint.sh"]
#ENTRYPOINT ["echo", "welcome to spider container"]

# Define default command.
CMD ["bash"]

在启动的脚本里面实现crontab的逻辑。  

#!/bin/sh
export PYTHONPATH=`pwd` && python bin/timer
echo $1
sleep $1
export PYTHONPATH=`pwd` && python bin/spider
while true;do
    sleep 3;
    xxxxxxx;
done;

但是如果你的crontab多的话,就不好处理了,你要写不同的sleep sec ?   这个适用于比较少的计划任务,很是随意。 


后来因为我这开发了一个关于业务数据预警的服务,我在服务里面加入了crontab的逻辑。  这里用的是python下的crontab模块。

#coding:utf-8
import time
from datetime import datetime
from crontab import CronTab
from buzz.lib.config import config

task_entry = CronTab(config.get('task_crontab','monitor'))
clean_entry = CronTab(config.get('clean_crontab','monitor'))

def task_cron_match():
    delay_time = task_entry.next(datetime.now())
    print delay_time
    if delay_time < 1:
        time.sleep(1)
        return True
    return None

def clean_cron_match():
    delay_time = clean_entry.next(datetime.now())
    if delay_time < 1:
        time.sleep(1)
        return True
    return None

if __name__=="__main__":
    print task_cron_match()
    print clean_cron_match()

config.ini 的配置信息是这样的,跟系统的crontab格式是一样的。  执行的时候,一个任务一个线程,不会因为某个任务堵塞超时,造成其他的任务不能准时的执行。  

task_crontab = 2 * * * *
clean_crontab = 30 1 * * *

后来在StackOverflow看到有人说,docker下是支持crontab的。   特么的…….

ADD crontab /var/spool/cron/xiaorui/nima
CMD cron -f 

编辑可用的crontab文件。 

vim crontab

*/1 * * * * root echo “Hello world” >> /var/log/cron.log 2>&1
*/1 * * * * root echo $(date) >> /var/log/cron.log 2>&1
*/1 * * * * root echo “1111” >> /var/log/cron.log 2>&1
*/1 * * * * root echo $(date +\%T) >> /var/log/cron.log 2>&1

#xiaorui.cc
FROM ubuntu:latest
MAINTAINER rfyiamcool@163.com
 
ADD crontab /etc/cron.d/hello-cron

RUN echo xiaorui.cc
 
RUN chmod 0644 /etc/cron.d/hello-cron
 
RUN touch /var/log/cron.log

CMD cron && tail -f /var/log/cron.log

构建含有crontab的docker image镜像。 

sudo docker build –rm -t xiaorui.cc/docker-crontab .

启动这个容器。

sudo docker run -t -i xiaorui.cc/docker-crontab

过两分钟我们会看到,容器输出的日志.  

Hello world

Hello world




大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

  1. 张少志 2015年8月17日 / 上午6:49

    crontab 只能给予单台node节点,可以考虑rundeck

发表评论

电子邮件地址不会被公开。 必填项已用*标注