16 July 2014
想做一个服务,能够每天定时调用执行。比如,每天定时推送微信,或者发送邮件,又或者为Android端推送消息。形式多种多样,内容主要是能有一个地方能够提醒展示今天要做的事情。像结婚纪念日、好朋友生日这种,还是挺重要的。

想做一个服务,能够每天定时调用执行。比如,每天定时推送微信,或者发送邮件,又或者为Android端推送消息。形式多种多样,内容主要是能有一个地方能够提醒展示今天要做的事情。像结婚纪念日、好朋友生日这种,还是挺重要的。

获取上面提到的这些内容都不难,比较难的是定时执行。

在语言层面,都实现了计时执行。比如,经过5分钟之后调用。计时器和定时器不同,可以比作是沙漏和闹钟。go语言可以使用time.NewTicker就能实现。但这个并不是定时执行。如果我们想每天早上6点都能执行,用这个就很费劲。我之间就做过这个尝试。

  • 先获取当前时间,再根据定时时间,相减得到计时器时间;
  • 执行改计时器时间,结束后执行操作;
  • 然后,将计时器修改为24小时为一个周期。

后来,我在Github上面看别人写的时钟,好像也是这么干的。这样做太蹩脚了。

再后来,了解到,Android平台可以使用AlarmManager来辅助实现定时器。其实就是能够调用系统自身的闹钟。自己比较熟的常见语言,都没找到语言层面实现的定时器,而Android平台的AlarmManager让我意识到,可能这个东西本来就不是语言负责的东西,而是系统层面的东西。

意识到这个问题之后,问题就迎刃而解了。直接发现Linux系统内置命令crontab就支持定时调用,并且服务器端也都是靠这个来做定时调用的。

定时调用需要写配置文件,Ubuntu默认是使用nano作为默认编辑器,果断不会用,先换成vi。

echo export EDITOR=/usr/bin/vim >> ~/.bashrc
source ~/.bashrc

接着,编写定时调用规则:

  • crontab -e 编写调用规则;
  • 在最后添加一行记录。记录分为两部分,执行时间和命令。这里的命令是/root/day >> $HOME/test.txt,执行day命令,并且将结果输出到文件test.txt当中;

    0 */1 * * * /root/day » $HOME/test.txt

第一部分,时间规则如下:

    含义   取值范围  
  第一段   代表分钟   0—59  
  第二段   代表小时   0—23  
  第三段   代表日期   1—31  
  第四段   代表月份   1—12  
  第五段   代表星期几,0代表星期日   0—6  
  • 最后,重启服务service cron restart即可。

参考文献

原文链接:Linux下定时执行——crontab,转载请注明来源!

EOF