前言
定时任务有什么用?
计划任务主要是做一些周期性的任务,比如凌晨3点定时备份数据、晚上23点开启网站抢购接口、凌晨0点关闭抢占接口等。
计划任务主要分为以下两种使用情况:
1.系统级别的定时任务
临时文件清理、系统信息采集、日志文件切割
2.用户级别的定时任务
定时向互联网同步时间、定时备份系统配置文件、定时备份数据库的数据。
正文
定时任务软件种类
- 定时任务软件:cronie
默认系统自带定时服务 crond(crontab) - 定时任务软件:atd
定时任务只执行一次,一次性定时服务 - 定时任务软件:anacron
主要用于非7*24小时运行的服务器
定时任务配置方式
系统已经存在的定时任务
- 系统定时任务周期:每小时
控制定时任务目录:/etc/cron.hourly - 系统定时任务周期:每一天
控制定时任务目录:/etc/cron.daily - 系统定时任务周期:每一周
控制定时任务目录:/etc/cron.weekly - 系统定时任务周期:每个月
控制定时任务目录:/etc/cron.monthly
如何设置系统定时任务?
在上面四个目录中,创建脚本文件即可
cd /etc/cron.hourly/
echo "echo jjj" > test.sh
相关文件
/var/log/cron :用来记录crontab这个服务的内容;
/var/log/messages :几乎所有的开机系统发生的错误都会在此记录;
/var/log/secure :记录登录系统存取数据的文件;
PS:系统默认定时任务没有1小时以下间隔时间
用户自定义定时任务
查看用户设置的定时任务
# 用命令查看
[root@cql ~]# crontab -l
no crontab for root
# 伪装成oldgirl身份查看oldgirl用户的定时任务信息
[root@cql ~]# crontab -u oldgirl -l
no crontab for oldgirl
# 利用文件查看
# 查看root用户编辑的定时任务信息
crontab -l == cat /var/spool/cron/root
如何配置定时任务?
# root用户定义的定时任务
crontab -e == vim /var/spool/cron/root
编写定时任务格式
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
* * * * * command
分 时 日 月 周
分 0-59
时 0-23
日 0-31
月 1-12
周 0-6
# 每天凌晨2点执行ls命令
0 2 * * * ls
# 每个月1号执行凌晨两点执行ls
0 2 1 * * ls
# 每月1号和15号12点都执行一次ls命令
0 12 1,15 * * ls
# 每月1号到15号12点都执行一次ls命令
0 12 1-15 * * ls
# 每年的2月14日凌晨2点,执行ls命令
0 2 14 2 * ls
# 每周日凌晨2点执行ls命令
0 2 * * 7 ls
# 每年6月份周五凌晨2点执行ls命令
0 2 * 6 5 ls
# 每个月的14号并且是周日,凌晨两点执行ls
0 2 14 * 7
# 满足每年的2月14日时候是周日的时候执行ls
0 2 14 2 7 ls
# 在每天凌晨2点这个时段,每10分钟执行一次,在2:00这个时刻会执行。
*/10 2 * * * ls
# 没分钟执行一次ls
* * * * * ls
*/1 * * * * ls
# 每年2月14日凌晨00点,执行ls
0 0 14 2 * ls
# 每5min执行一次,至保存的时候开始
*/5 * * * * ls
# 每年的1月和5月和8月每天晚上凌晨2点执行ls
00 2 1,5,8 * ls
# 在每年1到7月和9-12月的每天凌晨2点执行ls
00 02 1-7,9-12 * ls
# 每个月的1-8号执行,凌晨2点执行ls
00 02 1-8 * *
# 每个月的1号和10号和22号的凌晨4点45分执行ls命令
45 04 1,10,22 * * ls
# 每个月的每2天的8点到11点的3分和15分执行ls命令 ---------跨月的时候
3,15 8-11 */2 * * /bin/ls
保存时间:2020年4月26日 11点35分
4月28号,8点03分 和 8点15分,9点03分 和9点15分 , 10点03分和10点15分,11点03分和11点15分执行ls命令
4月30号
5月1号
5月3号
# 每天的00点-7点的每个小时和23点-00点的每个小时都执行ls命令
0 23-7/1 * * * /bin/ls
# 每周一到周五的晚上21点15分执行ls命令
15 21 * * 1-5 /bin/ls
定时任务编写的注意事项
1). 在定时任务执行的时候, 无法识别定时任务命令中的特殊字符
2). 在定时任务中, 操作文件要写好绝对路径信息
3). 在定时任务中, 识别的$PATH环境变量信息只有 /usr/bin:/bin
a 有些系统的特殊命令需要以绝对路径进行执行
b (慎用) 可以在定时任务配置文件开始定义新的PATH环境变量信息
4). 在执行定时任务时, 最好在所有任务命令后面加上 &>/dev/null 或 >/dev/null 2>&1
原因:执行定时任务会输出很多信息,会导致我们的磁盘空间减少,所以将输出信息输送到黑洞中(/dev/null)
5)如何在一个时间有多条指令需要执行,可以编写一个脚本文件,然后定时任务就是执行这个脚本文件。建议路径写据对路径。因为如果是相对路径,那么是相对这个定时任务配置文件的。
cat /var/spool/cron/root
/bin/sh shell.sh
如何查看确认定时任务已经执行过了?
tail -f /var/log/cron
Jan 26 17:07:01 oldboy-xiaodao CROND[2184]: (oldgirl) CMD (echo oldgirl_info >>/tmp/oldgirl_cron.txt )
Jan 26 17:08:01 oldboy-xiaodao CROND[2196]: (oldgirl) CMD (echo oldgirl_info >>/tmp/oldgirl_cron.txt )
Jan 26 17:09:01 oldboy-xiaodao crond[735]: (root) RELOAD (/var/spool/cron/root)
Jan 26 17:09:01 oldboy-xiaodao CROND[2203]: (oldgirl) CMD (echo oldgirl_info >>/tmp/oldgirl_cron.txt )
Jan 26 17:09:01 oldboy-xiaodao CROND[2204]: (root) CMD (cp /etc/hosts /tmp/hosts_bak_$(date +)
Jan 26 17:10:01 oldboy-xiaodao CROND[2224]: (root) CMD (cp /etc/hosts /tmp/hosts_bak_$(date +)
Jan 26 17:10:01 oldboy-xiaodao CROND[2225]: (oldgirl) CMD (echo oldgirl_info >>/tmp/oldgirl_cron.txt )
01 02 03 04
01: 定时任务执行的时间
02: 执行定时任务的主机名称
03: 执行哪个用户定义定时任务
04: 执行定时任务的命令信息
centos 系统禁止普通用户使用crontab命令
cron计划任务默认root用户与非root用户都可以执行,当然如果在安全方面想禁用这部分用户,则可以通过两个文件来解决:
- /etc/cron.allow
- /etc/cron.deny
cron.allow:定义允许使用crontab命令的用户
cron.deny:定义拒绝使用crontab命令的用户
这两个文件有优先级,普通用户在执行crontab命令的时候
1、系统先检测cron.allow文件是否存在;如果存在,则检测文件中存在的用户中是否有当前用户,检测通过则开始执行,检测不通过直接提示该用户没有执行权限
2、当系统没有检测到cron.allow文件存在的时候,则接下来检测cron.deny文件,看当前用户是否被deny掉,如果没有在cron.deny文件中检测到当前运行crontab的用户,则该命令可以成功执行,如果有检测到该用户在cron.deny文件中,则直接提示该用户没有执行权限
案例1:只允许root和www用户执行crontab命令,其他用户则禁止执行
在需要定义该策略的主机上面执行:
echo “www” > /etc/cron.allow
案例2:只拒绝anonymous用户执行crontab命令,其他用户都可以执行该命令:
rm -f /etc/cron.allow
echo “anonymous” > /etc/cron.deny
定时任务编写案例
- 定时重启系统服务,每天23到第二天7点每隔1小时重启nginx服务
1.测试定时执行命令
/application/sbin/nginx -s reload
2.编写定时任务信息
crontab -e
2.1 编写注释信息
# reboot nginx server
2.2 编写定时任务
00 23,00-07/1 * * * /application/sbin/nginx -s reload
3.检查定时任务效果
查看定时任务日志 tail -f /var/log/cron
查看定时任务效果 tail -f /oldboy/oldboy.txt
4.排查定时任务问题
注意事项:
表示整点17点18点19点 00 17-19 * * * cmd
表示半夜12点 00 00 * * * cmd
定时任务的9句劝告
①. 定时任务规则之前加注释
表示定时任务在干什么
②. 使用脚本替代命令执行定时任务
- 超过两条命,就用脚本
- 脚本相当于命令的合集
③. 定时任务中date命令%百分号
-
-
-
-
- date +%F%T >>/oldboy/time.txt 2>&1 (用 \ 转移)
-
-
-
④. 运行脚本一定要用/bin/sh /bin/bash
因为默认脚本没有执行权限
⑤. 定时任务中-命令或脚本结果(正确及错误)定向到黑洞(>/dev/null 2>&1)或追加到文件中 >>/tmp/oldboy.txt 2>&1
⑥. 避免不必要的程序及命令输出
⑦. 打包压缩使用相对路径(切到目标目录的上一级打包目标)
⑧. 定时任务脚本中的程序文件 ,尽量用绝对路径
⑨. 系统与命令位置有关的环境变量问题
$PATH = /usr/bin:/bin