16.Linux之计划任务

1.简介

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

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

    可以在命令行终端通过执行crontab -l或者service crond status命令来查看Crontab是否正常按照和启动。如下图所示显示服务器的Crontab服务已经处于运行状态,对于root用户来说还没有需要执行的计划任务。

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

    第一步:执行命令crontab -e

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

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

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

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

2.实践

  1. 配置格式说明

    16.Linux之计划任务_第1张图片案例说明 :星号表示任何时间都匹配,逗号表示匹配几个固定时间,减号表示匹配时间段,斜线表示每隔一段时间

    每天晚上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,通过查看其内容发现其命令格式中多了一个指定用户的地方。

    16.Linux之计划任务_第2张图片

    还有一些与该文件作用类似的配置文件:


    我们可以观察/var/log/cron文件中的日志内容:

    16.Linux之计划任务_第3张图片

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

    16.Linux之计划任务_第4张图片

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秒的时间,但是实现了统一计划任务的以秒为单位来执行的目的。

你可能感兴趣的:(16.Linux之计划任务)