crontd服务
-
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]
参数
参数 | 解释 | 示例 |
---|---|---|
-l | list 查看定时任务 | crontab -l |
-e | edit 编辑定时任务,建议手动编辑 | crontab -e |
-i | 删除定时任务,提示用户确认删除,避免出错 | crontab -i |
-r | 删除定时任务,移除/var/spool/cron/username文件 | crontab -r |
-u user | 指定用户执行任务,root 可以管理普通用户计划任务 | crontab -u redhat -l |
执行crontab 命令就是在修改
/var/spool/cron
中的定时任务文件。
编辑crontab
-
格式:
[root@server ~]# crontab -e
-
写入的命令格式:每一行书写一个工作,每个工作共有6个字段
代表意义 | 分钟 | 小时 | 日期 | 月份 | 星期 | 命令 |
---|---|---|---|---|---|---|
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7(0和7表示周日) | 执行的动作 |
*/5 6-8 * 8 1 /bin/bash /test.sh
特殊字符
特使字符 | 含义 |
---|---|
* | 任意时刻 |
- | 表示时间范围 |
,(逗号) | 分割时段 |
*/数字 | 指定时间间隔的频率,如:每3分钟执行一次,*/3 |
例
时间 | 含义 |
---|---|
1 2 * * * | 每天凌晨2点零1分执行动作 |
0 17 * * 1 | 每周一下午17点整执行动作 |
0 5 1,15 * * | 每月的1号和5号凌晨5点执行动作 |
40 4 * * 1-5 | 每周1到周5的凌晨4点40分执行动作 |
*/10 4 * * * | 每天凌晨4点每隔10分钟执行动作 |
3,15 8-11 */2 * * | 每隔2天的上午8点到11点的第3分钟和第15分钟执行动作 |
* * * * * | 每个1分钟执行一次动作 |
实验4
-
编写脚本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 进程号
实验5
-
让系统在每周1凌晨6点重启一次
[root@server ~]# crontab -e 0 6 * * 1 /sbin/shutdown -r now
实验6
-
设置邮件发送告警功能,每1分钟发送一封邮件
-
安装邮件服务
[root@server ~]# yum install mailx -y
-
配置邮件服务
[root@server ~]# vim /etc/mail.rc # 最后一行添加以下内容: set from=17674044@qq.com set smtp=smtp.qq.com set smtp-auth-user=17674044@qq.com set smtp-auth-password=do***cvqdubqbibj set smtp-auth=login # 注意:该文件输入完毕有的系统需要强制保存退出,输入wq!
-
测试邮件服务
[root@server ~]# echo "testmail" | mail -s "testmail" 17674044@qq.com
-
设置定时任务
[root@server ~]# crontab -e MAILTO=17674044@qq.com * * * * * echo "警告,SERVER服务器内存较低,速处理" | mail -v -s "告警邮件" 17674044@qq.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系统中%表示换行,需要增加转义符\