Linux定时任务crond
Linux定时任务crond
- crond 是Linux系统中用于设置周期性被执行的任务的工具。通过编辑crontab(cron table)文件,用户可以指定何时执行什么命令。crontab的语法非常直观,允许你指定分钟、小时、日、月、星期几来执行任务。
为什么要学习定时任务
- 临时文件清理
- 系统信息采集
- 日志文件切割
- 服务器时间同步
- 定时备份
定时任务配置
服务名字:crond daemon 守护进程
归纳解释:
- crond:是Linux系统中负责执行定时任务的守护进程(daemon)。它根据预先设定的时间表自动执行脚本或命令。
- 守护进程(daemon):是一种在后台运行的程序,通常与终端无关,用于执行系统维护任务或等待处理来自其他程序或用户的请求。crond就是一个典型的守护进程,它不断监听时间变化,并在特定时间触发相应的任务。
在Linux系统中,crond服务默认安装并启动。通过编辑/etc/crontab
或用户的crontab文件(使用crontab -e
命令),可以添加定时任务。例如,设置每天凌晨1点自动清理临时文件的任务,就可以通过crond来实现。
Linux系统中PATH的作用
- PATH变量:是Linux系统中一个非常重要的环境变量,它包含了一系列目录的路径,这些目录被系统用来查找用户输入的命令的可执行文件。
- 作用:当用户在命令行输入一个命令时,系统会按照PATH变量中设置的目录顺序进行搜索,找到第一个匹配的可执行文件并执行它。如果PATH中没有包含命令所在的目录,则系统会提示“命令未找到”。
举例说明:
假设/usr/local/bin
目录下有一个名为myscript
的脚本文件,并且该文件是可执行的。如果/usr/local/bin
不在PATH变量中,那么用户直接输入myscript
并回车时,系统会提示找不到该命令。为了能够在任何目录下都直接运行myscript
,可以将/usr/local/bin
添加到PATH变量中,方法是在用户的shell配置文件中(如.bashrc
或.bash_profile
)添加export PATH=$PATH:/usr/local/bin
。
crond定时任务相关配置和示例
配置文件:/etc/crontab
-
SHELL:指定执行定时任务时使用的shell,默认为
/bin/bash
。 -
PATH:指定执行命令时搜索可执行文件的路径,默认为
/sbin:/bin:/usr/sbin:/usr/bin
。 -
MAILTO:如果定时任务有输出(通常是错误或标准输出重定向到文件外的输出),则通过邮件发送给该变量指定的用户,默认为
root
。 -
## 配置文件 [root@localhost.localdomain ~ 15:03:17 4.2 8]# vim /etc/crontab ## 定时任务中,动作可以使用bash命令 SHELL=/bin/bash ## 在定时任务中,指定以下路径中的命令可以直接执行,不用写绝对路径 (规范:只要写定时任务所 有命令都加上绝对路径执行) PATH=/sbin:/bin:/usr/sbin:/usr/bin ## 在定时任务执行后,如果有报错,就会当成邮件发送给root用户 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 ## 定时任务的语法 * * * * * 分 时 日 月 周 0 - 59 0 - 23 1 - 31 1 - 12 0 - 6 or 1 - 7 周日(0 或 7)
示例:
-
00 02 * * * ls 每天凌晨2点整执行ls命令 00 02 1 * * ls 每个月的1号凌晨2点整执行ls命令 00 02 14 2 * ls 每年的2月14号凌晨2点执行ls命令 00 02 * * 7 ls 每周日凌晨2点执行ls命令 00 02 * * 0 ls 00 02 * 6 5 ls 每年6月份每个周五凌晨2点执行ls命令 00 02 14 * 7 ls 每个月14日并且是周日的那一天凌晨2点执行ls命令 00 02 14 2 7 ls 每个2月14日刚好是周日的凌晨2点执行ls命令 */10 02 * * * ls 每天的凌晨2点每10分钟执行一次ls命令 * * * * * ls 每分钟执行一次ls命令 */1 * * * * ls 00 00 14 2 * ls 每年2月14日的零点执行一次ls */5 * * * * ls 每5分钟执行一次ls 00 02 * 1,5,8 * ls 每年的1月5月8月中每天凌晨2点执行一次ls 00 02 1-8 * * ls 每个月的1号到8号凌晨2点执行一次ls 0 21 * * * ls 每天晚上21点执行ls 45 4 1,10,22 * * ls 每个月的1号 10号 22号的凌晨4点45分执行一次ls 45 4 1-10 * * ls 每个月的1号到10号凌晨4点45分执行一次ls 3,15 8-11 */2 * * ls 每2天的8点到11点的3分和15分执行一次ls 0 23-7/1 * * * ls 23 0-7 每小时整点执行一次ls 15 21 * * 1-5 ls 每周一到周五的9点15分执行ls
秒级任务:
由于crond本身不支持秒级任务,如果需要实现秒级任务,可以通过编写shell脚本,结合while true
循环和sleep
命令来实现。例如,上面的shell脚本示例就是一个每秒执行一次echo 123
的命令的简单秒级任务实现。
# crond定时任务最小级别就是分钟级,无法到秒级,想到秒级只能shell脚本
#!/bin/bash
while true;do
echo 123
sleep 1
done
定时任务命令
1.查看当前系统中有哪些定时任务
crontab -l cat /var/spool/cron/root 查看当前登录用户的定时任务
2.编辑定时任务
crontab -e vim /var/spool/cron/root 编辑当前登录用户的定时任务
3.清空定时任务
crontab -r
4.每个用户都有自己的定时任务, -u指定用户
[root@localhost.localdomain ~ 16:21:57 4.2 83]# crontab -l -u xxx
* * * * * ls
时间同步定时任务·
1.安装时间同步的命令
yum install -y ntpdate
2…同步阿里云时间同步服务器的时间
ntpdate ntp1.aliyun.com
3.编写定时任务 规范:作者 时间 作用
[root@localhost.localdomain ~ 16:44:00 4.2 133]# crontab -e
4.写入内容
# 作者:zls 时间:2024-8-12 作用:同步系统时间
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
案例:每天凌晨3点做一次备份
需求:将备份命令写入一个脚本中
格式化输出时间的方法
[root@localhost.localdomain / 17:26:02 4.2 139]# date +%F
2024-08-12
[root@localhost.localdomain / 17:26:07 4.2 140]# date +%Y
2024
[root@localhost.localdomain / 17:26:19 4.2 141]# date +%Y-%m
2024-08
[root@localhost.localdomain / 17:26:25 4.2 142]# date +%Y-%m-%d
2024-08-12
[root@localhost.localdomain / 17:26:33 4.2 143]# date +%F
2024-08-12
[root@localhost.localdomain / 17:26:38 4.2 144]# date +%H
17
[root@localhost.localdomain / 17:26:46 4.2 145]# date +%M
26
[root@localhost.localdomain / 17:26:57 4.2 146]# date +%S
02
[root@localhost.localdomain / 17:27:02 4.2 147]# date +%Y-%m-%d-%H:%M:%S
2024-08-12-17:27:42
[root@localhost.localdomain / 17:27:42 4.2 148]# date +%F-%T
2024-08-12-17:28:01
1.每天备份文件名要求格式:2024-08-12_web01_etc.tar.gz
tar zcf $(date +%F)_$(hostname)_etc.tar.gz etc/
2.存放备份内容的目录要求只保留3天的数据
find ./ ! -mtime -3|xargs rm -f
3.定时任务不识别有一些特殊符号当需要执行的命令,特殊符号多,命令长的时候,将命令写入脚本执行。
4.编写脚本
[root@localhost.localdomain ~ 00:09:32 4.2 199]# vim backup.sh
#!/bin/bash
mkdir -p /backup
/usr/bin/tar zcf /backup/$(date +%F)_$(hostname)_etc.tar.gz /etc/
find /backup ! -mtime -3|xargs rm -f
5.编写定时任务并要求在执行计划任务时,不要输出任务信息
[root@localhost.localdomain ~ 00:18:07 4.2 220]# crontab -e
# 作者:zls 时间:2024-8-12 作用:重要文件目录备份
00 3 * * * /bin/sh /root/backup.sh &>/dev/null
禁止指定用户使用定时任务
设置定时任务的黑名单
echo '用户名' >> /etc/cron.deny
定时任务调试思路
-
手动执行命令,然后保留执行成功的结果。
-
编写脚本
- 脚本需要统一路径/scripts
- 脚本内容复制执行成功的命令(减少每个环节出错几率)
- 脚本内容尽可能的优化, 使用一些变量或使用简单的判断语句
- 脚本执行的输出信息可以重定向至其他位置保留或写入/dev/null
-
执行脚本
- 使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash)
执行脚本成功后,复制该执行的命令,以便写入cron
-
编写计划任务
- 加上必要的注释信息, 人、时间、任务
- 设定计划任务执行的周期
- 粘贴执行脚本的命令(不要手敲)
-
调试计划任务
- 增加任务频率测试
- 检查环境变量问题
- 检查crond服务日志cat /var/log/cron
- 动态查看tail -f /var/log/cron
简略版
1.了解定时任务的需求
2.在命令行执行命令满足需求
3.将正确的命令保存下来
4.如果命令复杂,则将命令放入脚本中
5.定时任务中使用绝对路径的命令来执行脚本
6.定时任务调整成每分钟执行的频率,方便调试
7.定时任务没有报错,执行成功后,再修改时间
tail -f /var/log/cron