crontab 定时任务的使用
crond命令定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作
cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。
linux任务调度的工作主要分为以下两类:
系统执行的工作:系统周期性所要执行的工作,如更新whatis数据库 updatedb数据库,日志定期切割,收集系统状态信息,/tmp定期清理
启动crond服务
# systemctl start crond
# systemctl enable crond
cron命令参数介绍:
crontab的参数:
crontab -u hr #指定hr用户的cron服务
crontab -l #列出当前用户下的cron服务的详细内容
crontab -u mk -l #列出指定用户mk下的cron服务的详细内容
crontab -r #删除cron服务
crontab -e #编辑cron服务
例如:
crontab -u root -l # root查看自己的cron计划任务
crontab -u san -r # root想删除san的cron计划任务
cron -e 编辑时的语法
星期日用0或7表示
一行对应一个任务,特殊符号的含义:
* |
代表取值范围内的数字 |
(任意/每) |
/ |
指定时间的间隔频率 |
*/10 0-23/2 |
- |
代表从某个数字到某个数字 |
8-17 |
, |
分开几个离散的数字 |
6,10-13,20 |
L |
可以是每月最后一天或者每周最后一天 |
5L,表示最后一个周五(5表示周五,L表示最后) |
# |
表示第几个的意思 |
6#3,表示当月第3个星期六(6表示周六,3表示第3个) |
/ 步长。能除尽则执行。例如 5/15,代表从5开始,以15为步长。因此,当5/15位于分钟的位置时,表示小时内的第5、20、35和50分钟。
L 最后一天。可以是每月最后一天或者每周最后一天。如果用在 天(周)字段,并且前面加数字,则表示最后一个周N。例如5L,表示最后一个周五(5表示周五,L表示最后)。
W 工作日,指周一到周五的任意一天
# 表示第几个的意思,例如 6#3,表示当月第3个星期六(6表示周六,3表示第3个)
创建计划任务
例1:每天凌晨2点1分开始备份数据
# crontab -e #添加计划任务
1 2 * * * tar zcvf /opt/grub2.tar.gz /boot/grub2
# crontab -l #查看
例2:黑客:以非root用户添加计划任务。 最好使用已经存在系统用户添加。这里使用bin用户来添加
[root@xuegod63 ~]# crontab -u bin -e
1 * * * * echo "aaaaaaa" >> /tmp/bin.txt
排查:
[root@xuegod63 ~]# crontab -u bin -l
1 * * * * echo "aaaaaaa" >> /tmp/bin.txt
互动:如何排查所有用户的计划任务? 不会:1 有思路:6
做黑客要有一个很扎实的基础,还要有很好的思维
注:所有用户的计划任务,都会在/var/spool/cron/下产生对应的文件
[root@xuegod63 ~]# ll /var/spool/cron/
total 8
-rw------- 1 root root 42 Nov 12 10:11 bin
-rw------- 1 root root 19 Nov 12 10:06 root
所以后期可以使用这一招排查,黑客是否在你的机器中安装了定时任务
系统级别的计划任务
/etc/crontab 这个是系统任务调度的配置文件
# vim /etc/crontab
SHELL=/bin/bash #指定操作系统使用哪个shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #系统执行命令的搜索路径
MAILTO=root #将执行任务的信息通过邮件发送给xx用户
# 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
也可以直接在/etc/crontab中添加计划任务
使用crontab命令的注意事项:环境变量的问题
清理你的邮件日志 ,比如使用重定向 >/dev/null 2>&1
[root@xuegod63 bin]# ls /etc/cron #按两下tab键
cron.d/ cron.deny cron.monthly/ cron.weekly/
cron.daily/ cron.hourly/ crontab
注: cron.d/ #是系统自动定期需要做的任务,但是又不是按小时,按天,按星期,按月来执行的,那么就放在这个目录下面。
cron.deny #控制用户是否能做计划任务的文件;
cron.monthly/ #每月执行的脚本;
cron.weekly/ #每周执行的脚本;
cron.daily/ #每天执行的脚本;
cron.hourly/ #每小时执行的脚本;
crontab #主配置文件 也可添加任务;
实战-常见的计划任务写法和案例
常见写法:
每天晚上21:00 重启apache
0 21 * * * /etc/init.d/httpd restart
每月1、10、22日的4 : 45重启apache。
45 4 1,10,22 * * /etc/init.d/httpd restart
每月1到10日的4 : 45重启apache。
45 4 1-10 * * /etc/init.d/httpd restart
每隔两天的上午8点到11点的第3和第15分钟重启apach
3,15 8-11 */2 * * /etc/init.d/httpd restart
晚上11点到早上7点之间,每隔一小时重启apach
0 23-7/1 * * * /etc/init.d/apach restart
周一到周五每天晚上 21:15 寄一封信给 root@panda:
15 21 * * 1-5 mail -s "hi" root@panda < /etc/fstab
互动:crontab不支持每秒。 每2秒执行一次脚本,怎么写?
在脚本的死循环中,添加命令 sleep 2 ,执行30次自动退出,然后添加,计划任务:
* * * * * /back.sh
案例要求:
每天2:00备份/etc/目录到/tmp/backup下面
将备份命令写入一个脚本中
每天备份文件名要求格式: 2017-08-19_etc.tar.gz
在执行计划任务时,不要输出任务信息
存放备份内容的目录要求只保留三天的数据
====================================================
mkdir -p /tmp/backup || cd /tmp/backup
tar zcf `date +%F`_etc.tar.gz /etc
find /tmp/backup -name “*.tar.gz” -mtime +3 -exec rm -rf {}\;
============================================================
# crontab -l
13 21 * * * echo "xuegod1707" > /tmp/a.txt
0 22 * * * /root/backup.sh & > /dev/null
# cat backup.sh
#!/bin/bash
find /tmp/backup -name "*.tar.gz" -mtime +3 -exec rm -f {}\;
#另一种写法
#find /tmp/backup -name "*.tar.gz" -mtime +3 | xargs rm -f
tar zcf /tmp/backup/`date +%F`_etc.tar.gz /etc
注:工作中备份的文件不要放到/tmp,因为过一段时间,系统会清空备/tmp目录