Linux的例行性工作(crontab)
crontab服务
- at 命令是在指定的时间只能执行一次任务, crontab 命令可以循环重复的执行定时任务,与 Windows 中的计划任务有些类似
- crond 是 Linux 下用来周期地执行某种任务或等待处理某些事件的一个守护进程,在安装完成操 作系统后,默认会安装 crond 服务工具,且 crond 服务默认就是自启动的,若需要安装则执行如 下命令:
[root@server ~]# yum install crontabs # 安装,注意包名
[root@server ~]# systemctl status crond # 查看状态
-
crond 进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务,crontab 命令需要 crond 服务支持
- linux 任务调度的工作主要分为以下两类
- 系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
- 个人执行的工作:某个用户定期要做的工作,例如每隔 10 分钟检查邮件服务器是否有新信, 这些工作可由每个用户自行设置
crontab工作过程
- 当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入 的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高
- 当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令
- crontab 执行的每一项工作都会被 记录到 /var/log/cron 这个日志文件中
- 当用户使用 crontab 新建工作之后,该项工作就会被记录到 /var/spool/cron/目录里面
crontab命令详解
格式
crontab [-u user] [ -l | -r | -e ]
参数
编辑crontab
格式:
[root@server ~]# crontab -e

*/5 6-8 * 8 1 /bin/bash /test.sh
特殊字符
例
实验1:编写脚本test1.sh
[root@server ~]# vim test1.sh
#!/bin/bash
while :
do
echo "this is my test sh"$(date) >> /root/cro.txt
sleep 1
done
设置循环性周期性任务
[root@server ~]# crontab -e
*/1 * * * * sh /root/test1.sh
注意:crond服务是自动启动的,crontab命令只要保存退出后就会生效
查看任务:
[root@server ~] # crontab -l*/1 * * * * sh /root/test.sh
删除任务:
[root@server ~] # crontab -r # 删除[root@server ~] # crontab -l # 查看列表no crontab for root
[root@server ~] # ps -aux | grep test1[root@server ~] # kill 进程号
实验2:设置邮件发送告警功能,每1分钟发送一封邮件
先进行一下邮箱设置
在生成授权码之后,我们记得把授权码保存下来
安装邮件服务
[root@server ~]# yum install mailx -y
配置邮件服务
[root@server ~]# vim /etc/mail.rc
# 最后一行添加以下内容:
set from=fox_andy007@126.com
set smtp=smtp.126.com
set smtp-auth-user=fox_andy007@126.com
set smtp-auth-password="NYgwVuvWDTAp5Fek"
set smtp-auth=login
# 注意:该文件输入完毕有的系统需要强制保存退出,输入wq!
测试邮件服务
[root@server ~]# echo "testmail " | mail -s "testmail" fox_andy007@126.com
设置定时任务
[root@server ~]# crontab -e
MAILTO=fox_andy007@126.com
* * * * * echo "警告,SERVER服务器内存较低,速处理" | mail -v -s "告警邮件"
fox_andy007@126.com
书写定时任务的注意事项
- 6 个字段都不能为空,如果不确定则使用*表示任意时间
- crontab命令任务的最小时间单位为分钟,最大有效时间为月,如:2024年某时执行、3点30分30秒这样的时间日期无法被识别
- 定义时间时,日期和星期最好不要一起出现,由于都是以天为单位,非常让管理员混淆
- 在定时任务中不能,不管是写命令还是在脚本中写命令,最好都用绝对路径,相对路径有时会报错
系统级别的计划任务
crond 服务除了会在工作时查看 /var/spool/cron 文件夹下的定时任务文件以外,还会查看
/etc/cron.d 目录。而在 /etc/anacrontab 文件里面存放每天、每周、每月需要执行的系统任
务。
[root@server ~] # ls -l /etc/ | grep cron*
cron.d # 系统定时任务
cron.daily # 每天的任务
cront.deny # 定时任务黑名单
cron.hourly # 每小时执行的任务
cron.monthly # 每月的定时任务
crontab # 定义任务管理文件
cron.weekly # 每周的定时任务
crontab -e 时每个用户都可以执行的命令,但有时定时任务必须由系统执行,此时就需要编
辑/etc/crontab配置文件来实现
主配置文件:
[root@server ~]# vim /etc/crontab
仅能通过root定义,不可以使用普通账户身份去执行计划任务
方法:在/etc/crontab 最后一行新增计划任务即可
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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
分析
- SHELL=/bin/bash : 指定系统使用那个shell解释器去执行
- PATH=/sbin:/bin:/usr/sbin:/usr/bin : 系统执行命令的搜索路径
- MAILTO=root : 表示执行任务的信息通过邮件发送给谁
- user-name : 表示执行命令的用户是谁
例1:编写脚本testcrontab.sh,将时间写入/t1.txt文件中,每周二11点循环执行
[root@server ~]# vim testcrontab.sh
#!/bin/bash
date >> /t1.txt
[root@server ~]# vim /etc/crontab
0 11 * * 2 root /bin/bash /root/testcrontab.sh
例2:每天6:00点将日志/var/log/messages 文件备份到/backup目录中,备份后的日志文件名修改为logfileYYYY-MM-DD-HH:MM:SS
[root@server ~]# mkdir /backup # 新建目录
[root@server ~]# vim /etc/crontab # 编辑系统计划任务
0 6 * * * root /bin/cp /var/log/messages /backup/logfile`date +\%Y-\%m-
\%d-\%H:\%M:\%S`
# 注意:可以使用* * * * * 进行测试
# 反引号`` 表示将引起的内容识别为命令
# 在crontab系统中%表示换行,需要增加转义符\