第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语法+示例、生产环境下定时任务crontab的制作步骤与要点
复制代码
复制代码
生产环境下定时任务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机房正式环境
生产环境下定时任务crontab的制作步骤与要点、关于定时任务crontab的故障案例、调试定时任务
复制代码

 

posted @   雲淡風輕333  阅读(75)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 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框架的用法!
点击右上角即可分享
微信分享提示