当前位置: 首页 > 后端技术 > PHP

一次定时任务配置错误引发的思考

时间:2023-03-29 15:57:19 PHP

背景某商家反应系统无法登录,于是程序员尝试登录系统,成功了。他信心满满地认为“我的代码没问题”,于是让商家重新登录。尝试。然后业务人员成功登录,但是整个系统很卡,程序员才意识到是系统问题。排错步骤因为刚上线一个新功能,所以想到了配置定时任务。可能是定时任务配置不正确,导致PHP启动进程过多。使用命令ps-ef|grepphp查看,发现里面有很多不必要的数据更新脚本,涉及到与第三方接口的交互和大量的数据库更新操作,直接导致系统卡顿。使用命令crontab-l查看crontab配置。几个脚本的执行频率要配置为每小时执行一次。结果配置错误,导致每分钟执行一次。详情如下:#错误的配置**/1***/usr/local/bin/php/data/site/demo/yiidemo/sync-product#正确的配置0*/1***/usr/local/bin/php/data/site/demo/yiidemo/sync-product的问题已经查出来了,现在要做的就是快速杀掉那些不需要的进程。这时,我想到了万能的awk命令,如下:ps-ef|grepphp|awk'{print$2}'|xargskill-9执行后,系统开始恢复稳定。思考了整个问题,总结了排查,归根结底还是配置crontab不够仔细。同时,也引发了一些其他的想法。总结如下:系统突然死机。常见的故障排除思路是什么?查看内存使用率:free-g查看磁盘使用率:df-h查看磁盘I/O使用率:iostat-dx查看CPU使用率:top具体系统调优本文不做介绍。awk命令的基本使用常用命令awk'conditiontype1{action1}conditiontype2{action2}...'filenameawk后跟两个引号和花括号来设置你要执行的处理动作数据。比如:我们要取出账号和登录的IP,用[TAB]隔开,那么:[release@api_02~]$last-n5|awk'{print$1"\t"$3}'release117.111.111.11release117.111.111.11release117.111.111.11release117.111.111.11release117.111.111.11release117.111.111.11awk还有一些内置变量的含义变量名表示NF每行拥有的字段总数NR当前awk处理的行数FS当前分隔符,默认为空格键继续上面的例子,要求是:listtheaccountnumberofeachlinelistthenumberof当前处理的行并指示该行有多少字段[release@api_02~]$last-n5|awk'{print$1"\tlines:"NR"\tcolumns:"NF}'发布行:1列:10发布行:2列:10发布行:3列:10发布行:4列:10发布行:5列:10awk命令和更多高级功能这里就不介绍了。crontab配置的基本规则是:minutehourdaymonthweekcommand各字段含义如下:minute:分钟,取值范围:0-59之间的整数hour:小时,取值范围:0-23day之间的整数:date,取值范围:1-31之间的整数month:月份,取值范围:1-12之间的整数week:星期几,取值范围:0-7整数,其中0或7代表星期日command:要执行的命令,可以是系统命令,也可以是自己写的脚本文件。特殊字符:星号(*):表示所有值逗号(,):用逗号分隔的值可以用来指定一个列表范围,例如“1,2,6,7”竖杠(-):整数之间可以使用它们之间的中间横线表示一个整数范围,如“1-3”表示“1,2,3”正斜杠(/):可以使用正斜杠指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时,正斜杠可以和星号一起使用,比如*/10,如果用在分钟字段,表示每十分钟执行一次。一些常用的例子例1:每隔1分钟执行一次command命令:*****command例2:在每小时的第3、15分钟执行一次命令:3,15****command例3:8点am上午11点到11点的第3、15分钟执行命令:3,158-11***命令示例4:每两天上午8点到11点的第3、15分钟执行命令:3,158-11*/2**command例5:每周一早上8点到11点的第3、15分钟执行命令:3,158-11**1command例6:每晚restartsmbcommandat21:30:3021***/etc/init.d/smbrestart例七:每月1、10、22日4:45重启smbcommand:4541,10,22**/etc/init.d/smbrestart例8:每周六日1点10分重启smb命令:101**6,0/etc/init.d/smbrestart例9:每天18点开始:00到23:00之间每30分钟重新启动smb命令:0,3018-23***/etc/init.d/smbrestart参考ences如何解决linuxlag《Linux鸟哥的私房菜基础学习第三版--12.4.2章节》原文链接https://tsmliyun.github。io/2019/10/16/定时任务配置错误引起的思考/