背景:huskiesir最近用公司给分配的账户写了脚本去检测某应用状态并发送到企业邮箱,写完脚本之后去执行了一下,发现效果还不错,在邮箱显示效果如下:
10.11.116.6 检查结果OK,检查时间:2018-11-16_15:26:04
但是呢,经过crontab自动执行以后才发现,显示效果是这样的:
检查结果OK,检查时间:2018-11-16_13:17:05
咦,我的ip地址呢,这个问题搞得huskiesir一脸懵逼,为嘛经过crontab自动执行就出问题了?ok,接下来看看我写的脚本
#!/bin/bash export ip=`ifconfig|sed -n '2p'|sed 's/.*addr://g'|sed 's/Bcast.*//g'` cd /home/aaa/aaa_hb export okcount=`/home/aaa/aaa_hb/lijian.sh app|grep -o 'OK'|wc -l` if [ $okcount -eq 6 ] then echo "${ip}检查结果OK,检查时间:`date +%F_%T`">/tmp/jinan/logs/`date +%F_%T`.OK echo "${ip}检查结果OK,检查时间:`date +%F_%T`"|mail -s "${ip}App_sucess" 1111@qq.comecho "${ip}检查结果OK,检查时间:`date +%F_%T`"|mail -s "${ip}App_sucess" 2222@qq.comelse echo "$ip检查结果wrong,检查时间:`date +%F_%T`">/tmp/jinan/logs/`date +%F_%T`.FALSE echo "$ip检查结果wrong,检查时间:`date +%F_%T`"|mail -s "$ip\App_fail" 1111@qq.comecho "$ip检查结果wrong,检查时间:`date +%F_%T`"|mail -s "$ip\App_fail" 2222@qq.comfi
嗯,脚本也看到了,其实就是我去做了截取ip地址的操作,把其结果赋值给ip这个变量,嗯,这样看确实看不出什么,那就在出问题的环节去找吧~这让我想起了crontab,去查看crontab的日志看看能不能发现问题
在进行排查之前,先普及下关于crontab日志相关的知识和操作:
查看crontab任务是否执行需要查看:/var/log/cron
查看crontab任务执行的过程需要查看:/var/spool/mail/用户名文件
ok,那好,先查看crontab任务是否执行:
[root@AAA-111W-APP09:/aaa]#tail -n 3 /var/log/cron
Nov 16 10:00:01 SSS-537W-APP01 CROND[41846]: (sss) CMD (/tmp/jinan/countok.sh) Nov 16 10:16:01 SSS-537W-APP01 CROND[59810]: (sss) CMD (/tmp/jinan/countok.sh) Nov 16 10:19:01 SSS-537W-APP01 CROND[63002]: (sss) CMD (/tmp/jinan/countok.sh)
从图中可以看到,任务已经成功执行,接着去查看crontab在执行脚本的过程:
[root@AAA-111W-APP09:/aaa]#tail -n 50 /var/spool/mail/aaa
From root@AAA-111W-APP09.localdomain Fri Nov 16 13:17:06 2018 Return-Path: <root@SSS-537W-APP09.localdomain> X-Original-To: aaa Delivered-To: aaa@SSS-111W-APP09.localdomain Received: by AAA-111W-APP09.localdomain (Postfix, from userid 501) id 2FC7CF0; Fri, 16 Nov 2018 13:17:06 +0800 (CST) From: root@SSS-537W-APP01.localdomain (Cron Daemon) To: sss@AAA-111W-APP09.localdomain Subject: Cron <aaa@AAA-111W-APP09> sh /tmp/jinan/countok.sh Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated X-Cron-Env: <LANG=en_US.UTF-8> X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/home/aaa> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=aaa> X-Cron-Env: <USER=aaa> Message-Id: <20181116051706.2FC7CF0@SSS-111W-APP09.localdomain> Date: Fri, 16 Nov 2018 13:17:01 +0800 (CST)
/tmp/jinan/countok.sh: line 5: ifconfig: command not found
ok ,这个内容可以说信息量非常大了,我们可以从看到环境变量PATH=/usr/bin:/bin 执行用户USER=aaa,最有用的一条则是最下面的提示:ifconfig:command not found,哦?ifconfig命令还没有?ok,来让我们看一下ifconfig这条命令在哪里?
[aaa@AAA-111W-APP09:/home/sss]$which ifconfig /sbin/ifconfig
看到这里,你是不是明白为什么提示ifconfig:command not found了吧,嗯,看一下PATH变量的内容你就直到了,并没有包含/sbin,那么当你去执行ifconfig的时候,它找不到这条命令的,具体解决办法呢?就是在脚本里面声明一下环境变量喽,我是这样做的,在脚本里面重新定义一下PATH:
PATH="$PATH:/sbin"
最后,再次crontab执行的时候,发现问题才解决了~
在此,huskiesir也总结一下此类问题的解决思路:
经过crontab才出现问题,所以重点应该放在crontab上才能解决问题,所以才有以下操作,
-
- 先判断crontab是否有执行
- 查看crontab的具体执行过程