背景: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 ]
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 :: SSS-537W-APP01 CROND[]: (sss) CMD (/tmp/jinan/countok.sh)
Nov :: SSS-537W-APP01 CROND[]: (sss) CMD (/tmp/jinan/countok.sh)
Nov :: SSS-537W-APP01 CROND[]: (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  ::
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 )
id 2FC7CF0; Fri, Nov :: + (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-
Auto-Submitted: auto-generated
X-Cron-Env: <LANG=en_US.UTF->
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: <.2FC7CF0@SSS-111W-APP09.localdomain>
Date: Fri, Nov :: + (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的具体执行过程

crontab执行脚本和手动执行脚本输出结果不一致的问题处理的更多相关文章

  1. .net 程序通过 crontab 无法启动,手动执行脚本可以启动

    一.问题描述 .net 网关程序需要设置定时重启,按照日常操作先把正在运行的 PID kill 掉后,再执行启动服务. 把脚本放到 crontab 计划任务上,可以把服务 PID kill 掉,但无法 ...

  2. crontab的定时任务不能自动执行,但是手动执行脚本一直能成功

    crontab 问题小记: 环境变量问题, 养成良好的习惯, 在脚本开头export PATH 原因是 crontab 执行定时任务时,用的不是系统环境变量,而是自己的环境变量,可以把 echo $P ...

  3. crontab执行脚本与手动执行结果不一致

    反正网上说是环境变量问题,我就直接在脚本第二行加入以下代码: source /etc/profile source ~/.bashrc 问题是解决了!

  4. 关于linux crontab定时操作oracle不执行的问题解决方案

    问题描述:启动定时任务对oracle表进行操作,但是手动执行脚本无问题,定时任务执行无结果不反馈消息 解决方案:以centos7为例吗,首先确定脚本可手动执行,然后检查/var/log/cron下的日 ...

  5. crontab执行脚本中文乱码,手动执行没有问题

    crontab执行脚本中文乱码,手动执行没有问题 产生原因:       这是因为Unix/Linux下使用crontab时的运行环境已经不是用户环境了,因此原本用户下的一些环境变量的设置就失效了.例 ...

  6. crontab 定时执行脚本出错,但手动执行脚本正常

    原因: crontab 没有去读环境变量,需要再脚本中手动引入环境变量,可以用source 也可以用export 写死环境变量. 为了定时监控Linux系统CPU.内存.负载的使用情况,写了个Shel ...

  7. 分享一个shell脚本的坑:grep匹配+wc取值 在脚本执行后的结果与手动执行结果不一致

    打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...

  8. linux crontab定时任务运行shell脚本(shell执行sql文件)

    https://www.cnblogs.com/tiankongjava/p/6106743.html 今天做个linux定时任务(每晚12点把表汇总). 顺便写个博客记录一下~~ 为什么用linux ...

  9. jeecg安装——mysql数据库创建+手动执行初始化脚本

    国产的开源项目官方文档写得那么详细,已经是很厚道了,可惜俺这种菜鸟还是会碰到各种"小"问题,做个笔记先! 1.新建数据库: CREATE DATABASE jeecg DEFAUL ...

随机推荐

  1. Mysql 分库分表方案

    0 引言 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. mysql中有一种机制是表锁定和行锁 ...

  2. node——underscore的使用

    我在做新闻页面时,需要将之前存好点的data.json里的数据显示在首页上,而首页的每条新闻数据不能直接写定在上面,所以我们要将data里面的数据传递进去.我们需要使用underscore的templ ...

  3. CRM系统 - 总结 (一) 权限

    1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临:② 屌丝们,有没有想过为什么那些长得漂亮身 ...

  4. Ajax兼容性问题

    对于IE7及以上直接使用 XMLHttpRequest 就行,但对于过老版本IE建议直接提示用户下载新版浏览器更佳.或者用以下代码兼容IE6: function CreateXHR() { if(XM ...

  5. 阅读《Android 从入门到精通》(15)——数字时钟

    数字时钟(DigitalClock) java.lang.Object; android.view.View; android.widget.TextView; android.widget.Digi ...

  6. 【转载】How to Reset USB Device in Linux

    USB devices are anywhere nowadays, even many embedded devices replace the traditional serial devices ...

  7. Android Material Design-Getting Started(入门)-(一)

    转载请注明出处:http://blog.csdn.net/bbld_/article/details/40400343 翻译自:http://developer.android.com/trainin ...

  8. Android ImageView 不显示JPEG图片 及 Android Studio中怎样引用图片资源

    Android ImageView 不显示JPEG图片 今天在写一个小实例,ImageView在xml里面设置的是INVISIBLE,在代码里须要设置成setVisibility(View.VISIB ...

  9. hdoj--1010--Tempter of the Bone(搜索+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  10. VSCode向上的代码提示消除

    VSCode虽然好用, 但是有些用户体验实在非常差, 比如这种往上面弹的类型提示... 在用户设置中增加: "editor.parameterHints": false