zoukankan      html  css  js  c++  java
  • crontab执行脚本和手动执行脚本输出结果不一致的问题处理

      背景: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 "$ipApp_fail" 1111@qq.comecho "$ip检查结果wrong,检查时间:`date +%F_%T`"|mail -s "$ipApp_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的具体执行过程
  • 相关阅读:
    .net core 3.1 使用Redis缓存
    JavaSE 高级 第11节 缓冲输入输出字节流
    JavaSE 高级 第10节 字节数组输出流ByteArrayOutputStream
    JavaSE 高级 第09节 字节数组输入流ByteArrayInputStream
    JavaSE 高级 第08节 文件输出流FileOutputStream
    JavaSE 高级 第07节 文件输入流FileInputStream
    JavaSE 高级 第06节 初识I、O流
    JavaSE 高级 第05节 日期类与格式化
    JavaSE 高级 第04节 StringBuffer类
    JavaSE 高级 第03节 Math类与猜数字游戏
  • 原文地址:https://www.cnblogs.com/huskiesir/p/9970291.html
Copyright © 2011-2022 走看看