一、背景

自己写了个监控MGR状态的脚本,直接在Linux的Shell环境下可以执行成功,但是只要放到crontab里执行,就失败,脚本内容如下

#!/bin/bash

MAIL_ADDR=`cat /data/mysql_monitor/m.conf |grep mailaddress |cut -d ":" -f2`
USER=`cat /data/mysql_monitor/m.conf |grep mysql_user |cut -d ":" -f2`
PASSWORD=`cat /data/mysql_monitor/m.conf |grep mysql_pwd |cut -d ":" -f2`
MYSQL_STAT_LOG=`cat /data/mysql_monitor/m.conf |grep mysql_stat |cut -d ":" -f2` IP=`cat /data/mysql_monitor/m.conf |grep ip |cut -d ":" -f2`
MYSQL_PORT=`netstat -na|grep "LISTEN"|grep -w "3306"|awk -F[:" "]+ '{print $4}'`
DATE=$(date "+%Y-%m-%d %H:%M.%S") #Check_status(){
STATUS=$(mysql -u$USER -p$PASSWORD --connect_timeout=5 -e "SELECT * FROM performance_schema.replication_group_members;" 2>&1 |sed -n '/group_replication_applier/p' |grep -w "ONLINE") MGR=`echo $STATUS |grep ONLINE |awk '{print $5}' |head -n 1`
if [ "$MGR" = "ONLINE" ]
then
echo "MySQL MGR is ONLINE" > $MYSQL_STAT_LOG
else
echo "$DATE Server: $IP MySQL MGR status is not ONLINE,Please check MGR status!" > $MYSQL_STAT_LOG
python /data/mysql_monitor/mail.py 'mysql' $MAIL_ADDR "$IP Mysql Warn" < $MYSQL_STAT_LOG
fi

二、排查思路

一般这种情况都是由于环境变量没有获取到导致(所以为什么很多脚本里都会有一行export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin),可能包括脚本定义的环境变量,和系统本身的环境变量

脚本里定义的环境变量没有获取到

在脚本里引用的每个变量下一行,都加上echo $变量名并追加到文件中,例如:

# echo $MYSQL_USER >> /tmp/test

将脚本放到crontab中,然后观察/tmp/test,看看是哪一个变量没有获取到

2.1系统环境变量没有获取到

比如我这次要用mysql命令,那么先查出mysql命令在哪里

# which mysql
/usr/local/mysql/bin/mysql

查看crontab执行的环境变量

[root@oratest52 mysql_monitor]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root [root@oratest52 mysql_monitor]# echo $PATH
/usr/local/mysql/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

可以发现cron的环境变量少了/usr/local/bin,/usr/local/sbin,/root/bin,/usr/local/mysql/bin/

三、解决办法

在脚本里加入一行

export PATH=/usr/local/mysql/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

在我这个案例里,也可以在脚本执行mysql时用绝对路径

/usr/local/mysql/bin/mysql

可见在我们写脚本的时候,命令路径最好是用绝对路径,如果脚本用到一些非系统自带的命令,最好是在脚本里声明$PATH

最新文章

  1. 安装nodejs express框架时express命令行无效
  2. (二)Netty源码学习笔记之服务端启动
  3. 【leetcode】Remove Nth Node From End of List
  4. jdb - The Java Debugger
  5. 我的毕业设计——基于安卓和.NET的笔记本电脑远程控制系统
  6. Solr:Schema设计
  7. js:方法2. 字符串
  8. iOS学习之C语言数组
  9. 【ASP.Net MVC】在AspNet Mvc使用Ajax
  10. threaded模式下,比prefork模式要省资源
  11. jsp文件上传、下载
  12. c# 中日期的使用
  13. IOS中用模型取代字典的好处
  14. CSS3 3D转换
  15. poj 2112 Optimal Milking (二分图匹配的多重匹配)
  16. 18 java 代理模式 (转)
  17. linux杂记(四)热键[Tab],[ctrl]-c,[ctrl]-d,在线求助man page/info page
  18. CSS图片文字同行居中
  19. jquery初始化的三种方式
  20. TCP和UDP的最完整的区别

热门文章

  1. C# event 事件
  2. 洛谷$P1527$ [国家集训队]矩阵乘法 整体二分
  3. 接口自动化测试框架 -- reudom
  4. 一个简单的spring boot程序
  5. Salesforce LWC学习(十) 前端处理之 list 处理
  6. 动态规划最短路径LintcodeNO110
  7. C#事件(Event): 发布符合 .NET Framework Guidelines 的事件
  8. 小白学 Python 爬虫(38):爬虫框架 Scrapy 入门基础(六) Item Pipeline
  9. 使用Jenkins进行前端UVE项目部署
  10. P1850 换教室 期望dp