今日上午,生产环境怀疑某个cron定时任务没有执行,所以需要分析日志,详细过程如下,记录只为以后工作更加效率,笔者小白,请大神指点。

普及知识

cron是一种机制,crontab是指令
        它可以让系统在指定的时间,去执行某个指定的工作,我们可以使用crontab指令来管理cron机制

 1.取一段时间日志

语法:sed -n '/开始时间/,/结束时间/p' filename

sed -n '/Sep 20 08:50:*/,/Sep 20 09:50:*/p' /var/log/cron  >seq20_cron.log

2.过滤关键字 (也可以与上面结合一条命令搞定-这里为了步骤)

语法:grep –nr “关键字” filename

grep -nr "seq20_cron.log" > seq20.log

1.3 将过滤数据去重-统计次数-并排序

[root@web02 ~]# cat seq20.log |sort|uniq -c|sort -r
     63/****/webs/****cbeta/artisan
     62https://www.*****.cn/TimeTask/
     62https://www.*****.cn/TimeTask/
     62https://www.*****.cn/TimeTask/
     62 https://www.*****.cn/TimeTask/
     62https://www.*****.cn/TimeTask
     62https://www.*****.cn/TimeTask/
     62 https://www.*****.cn/TimeTask/
……省略若干

如果先 sort 的话,就会把所有重复的数据行变成相邻的数据行,再 uniq 的话,就去掉所有重复的数据行了。

参数介绍

-c, --count              ##在每行前加上表示相应行目出现次数的前缀编号 
-D, --all-repeated      ##只输出重复的行,不过有几行输出几行 
-i, --ignore-case       ##不区分大小写
-s, --skip-chars=N      //根-f有点像,不过-s是忽略,后面多少个字符 -s 5就忽略后面5个字符 
-u, --unique         ##去除重复的后,全部显示出来,根mysql的distinct功能上有点像  
-z, --zero-terminated   endlines with 0 byte, not newline 
-w, --check-chars=N      ##对每行第N个字符以后的内容不作对照 
--help              ##显示此帮助信息并退出  
--version              //显示版本信息并退出

1.4 筛选日志,确定任务执行结果 (时间段 当天的8点50-9点50)

将筛选出的日志文件,与原数据文件做对比,得出最后结论

结论:

1)关于 www.****.cn站点 定时任务共计:35条  8条被注销  27条在执行

2)27条中7条没有执行,但可以忽略因为定时任务设定时间,不在范围内

0 */6 * * * /usr/bin/curl https://www.*****.cn/
0 11 * * * /usr/bin/curl 
##省略。。。

3)剩余20个定时任务,都已执行

 

##以上内容,也可用于普通ddos***,配置筛选日志,在自动建立iptables规则,自动封杀恶意访问IP



第二、定时任务手动执行正常,但是放到crontab中就无法执行,或者取值错误等



写了个监控php队列脚本,并开启微信通知,与判断php队列个数异常自愈脚本

问题1,脚本手动执行 队列个数 16个,if判断是否等于16,正常,但是crontab 取到的个数是18个 ,所以导致队列无限重启?

问题2,脚本有执行权限,export声明PATH变量,无效?


解答:

1)脚本中无法调用系统环境变量,在脚本中重新声明,并加入需要定义的变量内容
2)将定时任务 输出到文件中,查看日志分析问题
3)使用echo的方式,逐步判断是哪行代码出现的问题,然后在根据日志排查
4)权限文件,查看脚本文件是否有X 执行权限,或尝试使用全路径执行








wKioL1nCJHbAnFrcAADWGZ-TffA909.png