目录:
1、Linux 计划任务概述(系统任务与用户任务)
Linux的任务调度主要分为两类:
系统任务调度:系统周期性所要执行的工作,比如系统数据备份、临时文件清理、缓存清理等。
用户任务调度:某个用户定期要执行的工作,比如用户数据备份、定时邮件提醒等,这些工作可由每个用户自行设置。
系统任务调度在:/etc/crontab 或在 /etc/cron.d/ 目录下载编写:
# ll /etc/cron.d/0hourly
-rw-r--r-- 1 root root 128 Jan 14 00:52 /etc/cron.d/0hourly
# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
用户任务调度:使用crontab命令来编写,写完后,存放在:/var/spool/cron/
cron服务进程(crond是cron的守护进程)每1分钟去读取这些文件:
【1】系统任务:/etc/crontab 文件 和 /etc/cron.d/ 目录
【2】用户任务: /var/spool/cron/ 目录
2、系统任务配置文件描述
/etc/cron.d/是一个目录,也由root维护。这个目录下可以存放多个crontab任务文件,这样我们就可以以文件的粒度对不同类别的任务调度进行管理了。
/etc/cron.d/目录下的任务调度文件需要遵循以下命名规范才能被cron服务正确扫描:
只能包含字母、数字、下划线和中划线(尤其注意不能包含 . )
/etc/crontab 作用与/etc/cron.d/ 一致,但一般不会在/etc/crontab文件中写。
# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly #每小时的01分钟去执行一遍:/etc/cron.hourly目录下所有的脚本
# ll /etc/cron.hourly/ #/etc/cron.hourly/ 目录下面的脚本具有可执行权限
-rwxr-xr-x 1 root root 392 Jan 14 00:52 0anacron
其中:通过run-parts命令来执行某个目录下的所有可执行脚本文件
/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly 这些是什么?
系统预设了这四个目录,用来放置【每小时、每天、每周、每月】要执行的可执行脚本文件;
注意:这四个目录只是预设,并没有完全启用,并不是直接将可执行脚本文件放入其中就可以,还需要run-parts命令的配合。
我所使用的centos 7.2中,就只有 /etc/cron.hourly 这一个目录作为系统样例被启用了(配置在了/etc/cron.d/目录下的 0hourly 文件中)。
系统任务不会出现在:/var/spool/cron/ 目录中!
通过/etc/cron.allow与/etc/cron.deny两个文件来控制哪个用户有权使用crontab。
这两个文件的内容与格式很简单,将需要配置的用户名写入文件,每个用户名占一行。
由于cron.allow与cron.deny同时存在的情况下,cron.deny没有实际意义。因此从逻辑、语义清晰的角度出发,不建议同时保留两个文件。根据实际需求,白名单与黑名单保留一个就好。
3、用户任务概述
用途:按照设置的时间间隔为用户反复执行某一项固定的系统任务;
软件包: cronie/crontabs
系统服务:crond
日志文件:/var/log/crond #非常重要,可用于排错
使用crontab 命令编写:
crontab -e [-u 用户名] #编辑
crontab -l [-u 用户名] #查看
crontab -r [-u 用户名] #清除
分 时 日 月 周 任务命令行(绝对路径) #需要顶格写!!!!
分钟:从0-59之间的整数
小时:从0-23之间的整数
日期:从1-31之间的整数
月份:从1-12之间的整数
星期:0-7之间的整数,0或7代表星期日
【*】: 匹配范围内任意时间
【,】: 分隔多个不连续的时间点
【-】: 指定连续时间范围
【/n】: 指定时间频率,每n
示例1:
# crontab -l -u root
* * * * * /usr/bin/date >>/root/data.txt & # 【*】 表示匹配所有,可以理解成【每】的意思,也就是每分钟执行一下后面的命令
示例2:
30 * * * * /usr/bin/date >>/root/data.txt & #每个小时的第30分钟执行一下后面的命令,也就是每半个小时执行一次
示例3:
30 8 * * * /usr/bin/date >>/root/data.txt & #每天8:30分钟执行后面的命令
示例4:
30 23 * * 5 /usr/bin/date >>/root/data.txt & #每周5晚上23:30分执行后面的命令
示例5:
30 23 1 * 5 /usr/bin/date >>/root/data.txt & #每周五或每月1日晚上23:30 执行
示例6:
30 23 * * 1-5 /usr/bin/date >>/root/data.txt & #每周一至周五晚上23:30执行
示例7:
30 23 * * 1,3,5 /usr/bin/date >>/root/data.txt & #每周一、周三、周五晚上23:30执行
示例8:
0 */2 * * * /usr/bin/date >>/root/data.txt & #每隔2个小时执行一次后面的命令
案例:
为用户root配置一个定时任务:
每天在本地时间:14:23执行,需要完成的任务操作为:/bin/echo hiya
# crontab -l -u root
35 14 * * * /bin/echo hiya >> /root/hiya.txt
#ls /var/spool/cron/ #该目录下存放着所有用户的crontab任务,直接cat 就可以查看用户的定时任务
root
6、如何实现秒级的任务?
crontab可配置的最小的时间粒度是分钟,那么我们如何实现秒级的任务呢?有如下两种方式:
相同的任务配置多条,通过sleep来制造执行的时间差,如每10秒执行一次:
* * * * * command
* * * * * sleep 10; command
* * * * * sleep 20; command
* * * * * sleep 30; command
* * * * * sleep 40; command
* * * * * sleep 50; command
仅配置一条任务,在任务所执行的脚本内,通过for循环实现每隔n秒执行一次的逻辑,如:
* * * * * script
#!/bin/sh
STEP=5
for ((i=0; i < 60; i+=STEP))
do
TIME_NOW=$(date "+%Y-%m-%d %H:%M:%S")
echo -e $TIME_NOW >> /root/scripts/logs/test.log
sleep $STEP
done