脚本在Shell可以执行成功,放到crontab里执行失败
2024-08-31 16:26:44
一、背景
自己写了个监控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
最新文章
- 安装nodejs express框架时express命令行无效
- (二)Netty源码学习笔记之服务端启动
- 【leetcode】Remove Nth Node From End of List
- jdb - The Java Debugger
- 我的毕业设计——基于安卓和.NET的笔记本电脑远程控制系统
- Solr:Schema设计
- js:方法2. 字符串
- iOS学习之C语言数组
- 【ASP.Net MVC】在AspNet Mvc使用Ajax
- threaded模式下,比prefork模式要省资源
- jsp文件上传、下载
- c# 中日期的使用
- IOS中用模型取代字典的好处
- CSS3 3D转换
- poj 2112 Optimal Milking (二分图匹配的多重匹配)
- 18 java 代理模式 (转)
- linux杂记(四)热键[Tab],[ctrl]-c,[ctrl]-d,在线求助man page/info page
- CSS图片文字同行居中
- jquery初始化的三种方式
- TCP和UDP的最完整的区别
热门文章
- C# event 事件
- 洛谷$P1527$ [国家集训队]矩阵乘法 整体二分
- 接口自动化测试框架 -- reudom
- 一个简单的spring boot程序
- Salesforce LWC学习(十) 前端处理之 list 处理
- 动态规划最短路径LintcodeNO110
- C#事件(Event): 发布符合 .NET Framework Guidelines 的事件
- 小白学 Python 爬虫(38):爬虫框架 Scrapy 入门基础(六) Item Pipeline
- 使用Jenkins进行前端UVE项目部署
- P1850 换教室 期望dp