目录
最近工作中有这么一个场景:定时将日志文件入库(MySQL),我使用到了Linux自带的Crontab定时任务和MySQL的LOAD DATA,这篇记录一下Crontab的简单使用示例,下一篇记录一下使用Crontab定时入库数据,敬请期待。
如果我的博客对你有帮助,欢迎进行评论✏️✏️、点赞👍👍、收藏⭐️⭐️,满足一下我的虚荣心💖🙏🙏🙏 。
语法
我们看下 /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
如上,最后一行就是语法:
* * * * * user-name command to be executed
前五个*:配置定时任务执行的时间。
user-name:以什么身份任务。
command to be executed:要执行的脚本。
这里补充另一个参数:run-parts
run-parts:执行指定目录下的脚本。
crontab 时间表达式
先看下系统 /etc/crontab 文件内容,如下:
* * * * * user-name command to be executed
项目 | 含义 | 范围 |
---|---|---|
第一个"*" | 一小时当中的第几分钟(minute) | 0~59 |
第二个"*" | 一天当中的第几小时(hour) | 0~23 |
第三个"*" | 一个月当中的第几天(day) | 1~31 |
第四个"*" | 一年当中的第几个月(month) | 1~12 |
第五个"*" | 一周当中的星期几(week) | 0~7(0和7都代表星期日) |
在时间表示中,还有一些特殊符号需要知道,如下:
特殊符号 | 含义 |
---|---|
*(星号) | 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。 |
,(逗号) | 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。 |
-(中杠) | 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。 |
/(正斜线) | 代表每隔多久执行一次。比如"*/10命令",代表每隔 10 分钟就执行一次命令。 |
简单示例:
表达式 | 含义 |
---|---|
45 22 *** | 在每天22 点 45 分执行 |
*/10 4 *** | 每天的凌晨 4 点,每隔 10 分钟执行一次 |
0 5 1,15** | 在每月 1 日和 15 日的凌晨 5 点 0 分执行 |
0 17 ** 1 | 在每周一的 17 点 0 分执行 |
40 4 ** 1-5 | 在每周一到周五的凌晨 4 点 40 分执行 |
注意:星期几和几日最好不要同时出现,因为它们定义的都是天,非常容易让管理员混淆。
执行目录下的所有脚本
run-parts 指定目录下的脚本都会执行。
示例:
* * * * * root run-parts /home/cron
/home/cron 目录下所有脚本都会每分钟执行一次。
执行指定脚本
不使用 run-parts 时,可以直接指定要执行的脚本。
示例:
* * * * * root /home/cron/test.sh
/home/cron 目录下虽然有多个脚本,但是只会执行 test.sh 脚本。
执行日志
定时任务的执行日志保存在 /var/log/cron 文件中,可以查看日志检查定时任务的执行过程中有没有报错:
tail -f /var/log/cron
邮件通知
在 /var/spool/mail 目录下存放发送给每个用户的消息,这里面相对log中记录的更为详细,如果脚本运行有错误,也会记录,脚本中的测试输出语句,也会进行记录。
比如你有一个用户yjh,则在此目录下会生成一个yjh的邮件通知文件,文件名就是用户名,我这里用的root执行的,查看日志指令如下:
tail -f /var/spool/mail/root
下面这是我实际使用时的部分日志:
限制某些用户使用crond
通过 /etc/cron.allow 和 /etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。
当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高。
当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。
定时任务管理
启动
systemctl start crond.service
停止
systemctl stop crond.service
重启
systemctl restart crond.service
查看状态
systemctl status crond.service
简单示例
每分钟都执行一次/home/cron目录中的test.sh脚本,向/home/cron/test.log 文件写入hello,脚本执行者是root用户
新建测试脚本
vim /home/cron/test.sh
内容如下:
#/bin/bash
echo "hello" >> /home/cron/test.log
编辑定时任务crontab
vim /etc/crontab
内容如下:
# 每分钟执行一次
* * * * * root run-parts /home/cron
脚本授权
chmod 755 test.sh
启动定时任务
systemctl start crond.service
几分钟后我们发现 /home/cron 目录下多了一个 test.log 文件,查看下test.log文件内容如下:
至此结束!!!