背景: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的具體執行過程