16.Linux之计划任务

1.简介

    Crontab是一个用于设置周期性执行任务的工具,能够设置按照分钟、小时、天、周、月来执行。apache

    周期性执行的任务称为Cron Job,周期性执行的任务列表称为Cron Table。
服务器

    能够在命令行终端经过执行crontab -l或者service crond status命令来查看Crontab是否正常按照和启动。以下图所示显示服务器的Crontab服务已经处于运行状态,对于root用户来讲尚未须要执行的计划任务。
工具

    经过一个简单示例来演示一下如何使用Crontab:*/1 * * * * date >> /tmp/date.log,每分钟输出当前时间到/tmp/date.log文件中。
spa

    第一步:执行命令crontab -e
命令行

    第二步:按下字母i键进入插入状态,输入*/1 * * * * date >> /tmp/date.logrest

    第三部:按下Esc键退出插入状态,输入:wq,保存并退出,此时定时任务设置完成
日志

    第四部:执行命令tail -f /tmp/date.log,查看文件内容是不是一分钟增长一行当前时间。确认后Ctrl + c退出便可。
crontab

    因此,总结一句话就是Linux计划任务服务crond利用crontab工具来修改相关配置文件,从而实现定时任务。
字符串

2.实践

  1. 配置格式说明test

    案例说明 :星号表示任什么时候间都匹配,逗号表示匹配几个固定时间,减号表示匹配时间段,斜线表示每隔一段时间

    天天晚上23:30重启apache服务:30 23 * * * service httpd restart

    每个月1日、10日、20日的晚上23:30重启apache服务:30 23 1,10,20 * * service httpd restart

    每个月1日至10日的晚上23:30重启apache服务:30 23 1-10 * * service httpd restart

    每隔2分钟重启apache服务:*/2 * * * * service httpd restart、1-59/2 * * * * service httpd restart

    天天晚上23点到第二天7点,每隔1小时重启apache服务:0 23-7/1 * * * service httpd restart

    天天晚上18点到23点,每隔30分钟重启apache服务:0,30 18-23 * * * service httpd restart

  2. crontab命令说明


    -u:指定查看或者编辑哪一个用户的计划任务,不指定用户时默认为当前登陆用户

    -e:编辑计划任务的配置文件

    -l:列出配置文件中的计划任务列表

    案例说明:

    第一步:使用crontab -u root -e给root用户增长计划任务:1-59/2 * * * * echo "root's crontab execute..."

    第二步:使用crontab -u test -e给test用户增长计划任务:0-58/2 * * * * echo "test's crontab execute..."

    第三步:使用tail -f /var/log/cron查看计划任务的执行历史


  3. 配置文件说明

    全局配置文件:/etc/crontab,经过查看其内容发现其命令格式中多了一个指定用户的地方。


    还有一些与该文件做用相似的配置文件:


    咱们能够观察/var/log/cron文件中的日志内容:

    而经过crontab -e修改的内容并无在上面的配置文件中保存,那在哪里呢?/var/spool/cron/。

3.常见错误

  1. 环境变量:经过expor设置的环境变量是不可以直接在计划任务中直接使用的。

  2. 命令行双引号中使用百分号%时,未加反斜线\

  3. 第三个和第五个域是“或”的的关系,即配置分钟、小时、日、月、星期几中的日和星期几是或者的关系,不是而且的关系。

    如:每个月第一个星期日早晨1:59执行脚本test.sh

    错误的写法:59 1 1-7 * 0 /root/test.sh

    正确的写法:59 1 1-7 * * test `date + \%w` -eq 0 && /root/test.sh

    分析:错误的写法错误的缘由在于1-7解析为每个月的1日到7日,星号后面的0表明周日,因为二者是或者的关系,因此真正表达的含义是每个月的1日到7日或者是周日的1:59执行脚本。

  4. 分钟设置误用

    在使用其余单位进行设定周期时,分钟不要设置为星号*,要设置为0。


补充:如何经过crontab实现以秒为单位的计划任务?

例:执行命令:date;sleep 0.5s;date,屡次执行后能够感受到两个date命令之间会有一段时间间隔

因此咱们能够经过sleep与crontab结合的方式实现以秒为单位的计划任务。

*/1 * * * * echo "start"

*/1 * * * * sleep 30s;echo "start..."

分析以上两个计划任务,目的都是每分钟输出字符串“start...”,可是因为第二个计划任务在输出字符串以前先sleep30秒,这样就和第一个计划任务隔开了30秒的时间,可是实现了统一计划任务的以秒为单位来执行的目的。

相关文章
相关标签/搜索