第7章:定时任务crontab
定时任务
系统定时任务、用户定时任务crontab、crontab语法+示例、生产环境下定时任务crontab的制作步骤与要点

系统定时任务、用户定时任务crontab、crontab语法+示例 ------------------------------------------------------------------------------------------------------------------- 系统定时任务计划 (目前只是了解) 1.不用管理员干预,系统自动执行。 2.也可以利用系统任务为管理员服务。 [root@oldboyedu /etc/cron.daily]# ll /etc/cron.daily/logrotate /etc/logrotate.conf -rwx------. 1 root root 219 Oct 31 2018 /etc/cron.daily/logrotate -rw-r--r--. 1 root root 662 Jul 31 2013 /etc/logrotate.conf 按天切割日志,就可以用logrotate。 ------------------------------------------------------------------------------------------------------------------- 用户定时任务计划 Linux定时任务的常用软件crond cron是定时任务的软件名,crond是服务进程名,真正实现定时任务服务。crontab命令是用来设置定时任务规则的配置命令。 /etc/cron.deny 该文件中所列用户不允许使用crontab命令(不常用) /etc/cron.allow 该文件中所列用户允许使用crontab命令,优先于/etc/cron.deny /var/spool/cron/ 所有用户的cron配置文件默认保存在此目录下,以root为例:root的cron配置文件就是/var/spool/cron/root crontab -e 等效于 vim /var/spool/cron/root crontab -l 等效于 cat /var/spool/cron/root systemctl status crond systemctl status crond.service #查看状态,同上一条命令等效 systemctl start crond.service systemctl stop crond.service systemctl disable crond.service #开机时,禁止启动crond.service systemctl enable crond.service #开机时,自动启动crond.service crontab 用来设置定时任务规则的配置命令。 -l l列表 查看已经设置的定时任务* 等效于 cat /var/spool/cron/root -e edit 编辑定时任务* 等效于 vim /var/spool/cron/root -u user 查看特定用户下定时任务 ------------------------------------------------------------------------------------------------------------------- 编写定时任务的语法(即/var/spool/cron/用户 中保存的定时任务的语法): # 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 # | | | | | # * * * * * (command to be executed) 共六列: 第一列:分 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 第六列:要执行的任务命令或程序 特殊符号: * 表示 任意 - 连续区间 1-10 , 列举 1,2,3,4,8 /n n是数字。n代表自然数字,即“每隔n单位时间”,例如:每10分钟执行一次任务可以写成 定时任务的语法示例: */1 * * * * /bin/sh /scripts/data.sh #每隔1分钟,执行任务 30 3,12 * * * /bin/sh /scripts/oldboy.sh #每天的3点半,12点半,执行任务 30 */6 * * * /bin/sh /scripts/oldboy.sh 30 8-18/2 * * * /bin/sh /scripts/oldboy.sh 45 4 1,10,22 * * /application/apache/bin/apachectl graceful 10 1 * * 6,0 /application/apache/bin/apachectl graceful 0,30 18-23 * * * /application/apache/bin/apachectl graceful 00 */1 * * * /application/apache/bin/apachectl graceful ################# * 23,00-07/1 * * * /application/apache/bin/apachectl graceful #注意,这个是23点到早上7点,每分钟执行!

生产环境下定时任务crontab的制作步骤与要点、关于定时任务crontab的故障案例、调试定时任务 ------------------------------------------------------------------------------------------------------------------- 生产环境下定时任务的制作步骤 1.命令行测试命令 tar zcf /data/html_$(date +%F).tar.gz ./html #打包要到被打包文件的上一级目录进行打包,然后用 './xxx' 进行打包,这是规范; 同时还要注意,tar命令不要加参数v,不要产生垃圾日志 2.尽量用脚本文件来实现,即把上述的命令存放在脚本中 #mkdir /server/scripts -p #存放脚本的文件 运维规范: 脚本位置:/server/scripts 软件位置:/server/tools 编译位置:/application/软件名字-版本,然后要软链接。 cd /server/scripts #cat bak.sh cd /var/www tar zcf /data/html_$(date +%F).tar.gz ./html 命令行执行脚本进行测试 /bin/sh /server/scripts/bak.sh 3.编辑定时任务 #bak html dir by oldboy at 2020108 #备注 00 00 * * * /bin/sh /server/scripts/bak.sh &>/dev/null #优秀答案 注意将产生的垃圾倒入黑洞(&>/dev/null) 4.检查正式结果 [root@oldboyedu /server/scripts]# ls -l /data#此处是一个定时打包任务 =========================== 生产环境下定时任务的制作要点 1:为定时任务规则加必要的注释 2:所有的定时任务尽量都以脚本的形式执行-----推荐使用脚本的方式来执行定时任务 3:在执行的Shell脚本前加上/bin/sh 4:定时任务中命令或脚本的结尾加>/dev/null 2>&1 -----不做这个容易出故障 5:在指定用户下执行相关定时任务 6:生产任务计划程序中不要随意打印输出信息,有输出的想法去掉。 7:定时任务执行的脚本要存放到规范路径下 8:配置定时任务要规范操作过程,减少出错 9:定时任务脚本中程序命令及路径尽量用全路径-----记得用全路径 10:时间变量%号要用反斜线转义(只有定时任务里是命令时需要) 11:若脚本中调用了系统环境变量,要重新定义-----这个容易出故障 12:出错或无法执行,就检查/var/log/cron日志 ------------------------------------------------------------------------------------------------------------------- 企业故障案例:No space left on device常见企业故障案例 故障现象:No space left on device 排查命令:df -i (inode被占满) 故障原因:因为定时任务没有将产生的信息导向黑洞(&>/dev/null),此时产生的输出将会给系统root发邮件,而邮件服务器postfix服务默认不开,这些给系统发的邮件就会堆在临时目录(堆积了大量小文件) /var/spool/clientmqueue/ centos6 /var/spool/postfix/maildrop/ centos7 ================================= 企业故障案例(export变量生产案例): 故障现象:程序通过手动可以执行,放定时任务里不执行。 故障原因:环境变量不一致导致错误 1.bash登陆linux,会加载所有环境变量(~/.bash_profile,~/.bash_rc,/etc/profile,/etc/bashrc);而定时任务执行脚本属于非登陆状态,只加载/etc/bashrc。 2.在工作中,所有运维都会把变量放到此文件/etc/profile,而非登陆状态不加载/etc/profile 解决方法:在脚本中使用export重新声明下该变量,以确保脚本正确执行。 ------------------------------------------------------------------------------------------------------------------- 调试定时任务: 1、查看错误日志*****/var/log/cron 学会最小化排除:先清空,>/var/log/cron;然后在测试和观察。 2、增加执行任务频率调试任务 *****(把频率调快。) 3、把定时任务执行时间比当前时间拖后5分钟 4、调整系统时间(测试环境还凑合)不推荐这种方式 5、通过脚本日志输出调试定时任务 定时任务输出* * * * * /bin/sh /server/scripts/bak.sh &>/tmp/bak.log 脚本输出:tar zcvf oldboy.tar.gz ./data &>/tmp/tar.log 注意点:有时候程序只能执行一次。一定要在测试环境测试好,然后直接复制到正式。 代码发布流程: 办公室测试环境===>IDC机房测试环境===>IDC机房正式环境
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!