Chinaunix
标题:
shell脚本 ,添加到crontab 中执行的时候,就有错
[打印本页]
作者:
oyqiaojin
时间:
2013-04-17 12:49
标题:
shell脚本 ,添加到crontab 中执行的时候,就有错
本帖最后由 oyqiaojin 于 2013-04-17 14:11 编辑
写了个脚本,主要是对mysql的主从的监控,手动执行的时候正常
日志文件check_repl.log,内容如下:
##############################################
Master_Log:000030
Master_Log_Pos:176025373
Relay_Master_Log_File:000030
Exec_Master_Log_Pos:176025373
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
Seconds_Behind_Master:0
0
2013-04-17 12:43:12 Master-Slave is OK.
当我添加到crontab中定时执行的时候,就是这样了
##############################################
Master_Log:000030
Master_Log_Pos:176025373
Relay_Master_Log_File:
Exec_Master_Log_Pos:
Slave_IO_Running:
Slave_SQL_Running:
Seconds_Behind_Master:
2013-04-17 12:05:01 Error:不能获取slave的相关参数
请问为什么会获取不到slave的值能?mysql 主从都是正常的。
这是我脚本
#!/bin/sh
user=replmonitor
passwd=123456
master_ip=192.168.1.108
log="/home/mysql/data/check_repl.log"
IPADD=`ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'`
#`ifconfig|grep inet|awk '{print $2}'|sed 's/addr://g'| grep -Ev "^$"`;
HOST_NAME="db002";
NOWTIME=`date +"%Y-%m-%d %H:%M:%S"`;
MAILTO="ouyangqiaojin@ppdai.com";
MAIL_SUB="$host_name log-slave Capacity Report $NOWTIME !";
tmpfile=/tmp/mysql_mon.tmp
value()
{
master=`/usr/local/mysql/bin/mysql -u$user -p$passwd -h$master_ip -e "show master status\G;"|egrep "File|Position"`
slave=`mysql -u$user -p$passwd -e "show slave status\G;"|egrep "Relay_Master_Log_File|Exec_Master_Log_Pos|Seconds_Behind_Master|Slave_IO_Running|Slave_SQL_Running"`
#取主库上的bin-log号及写入的当前日志位置
#echo $master>>$log
#echo $slave>>$log
Master_Log=`echo $master |awk '{print $2}'|awk -F "." '{print $2}'`
Master_Log_Pos=`echo $master |awk '{print $4}'`
#取从库上当前同步主库的位置
Relay_Master_Log_File=`echo $slave |awk '{print $2}'|awk -F "." '{print $2}'`
Exec_Master_Log_Pos=`echo $slave |awk '{print $8}'`
Slave_IO_Running=`echo $slave |awk '{print $4}'`
Slave_SQL_Running=`echo $slave |awk '{print $6}'`
Seconds_Behind_Master=`echo $slave |awk '{print $10}'`
echo "Master_Log:"$Master_Log>>$log
echo "Master_Log_Pos:"$Master_Log_Pos>>$log
echo "Relay_Master_Log_File:"$Relay_Master_Log_File>>$log
echo "Exec_Master_Log_Pos:"$Exec_Master_Log_Pos>>$log
echo "Slave_IO_Running:"$Slave_IO_Running>>$log
echo "Slave_SQL_Running:"$Slave_SQL_Running>>$log
echo "Seconds_Behind_Master:"$Seconds_Behind_Master>>$log
}
mhead()
{
echo "" >$tmpfile;
echo "From :$HOST_NAME" >>$tmpfile
echo "State :Error" >>$tmpfile
echo "ReportBy:$0" >> $tmpfile
echo "DateTime:$NOWTIME" >> $tmpfile
echo "Info :$host_name Master-Slave Exception!!" >> $tmpfile
echo " Master_Log:"$Master_Log>>$tmpfile
echo " Master_Log_Pos:"$Master_Log_Pos>>$tmpfile
echo " Relay_Master_Log_File:"$Relay_Master_Log_File>>$tmpfile
echo " Exec_Master_Log_Pos:"$Exec_Master_Log_Pos>>$tmpfile
echo " Slave_IO_Running:"$Slave_IO_Running>>$tmpfile
echo " Slave_SQL_Running:"$Slave_SQL_Running>>$tmpfile
echo " Seconds_Behind_Master:"$Seconds_Behind_Master>>$tmpfile
echo "IP :$IPADD" >> $tmpfile
echo "" >>$tmpfile;
}
smail()
{
#mhead
mail -s "MAIL_SUB" $MAILTO < $tmpfile
}
for((i=1;i<=10;i++));
do
echo "##############################################">>$log
value
#smail
for x in `mysql -u$user -p$passwd -e "show slave status\G" | grep Running | grep -ie "IO" | awk '{print $2}'`
do
if [ $x != Yes ]; then
echo "$NOWTIME Error:Slave_IO_Running is not Yes" >>$log
mhead;
mysql -u$user -p$passwd -e "show slave status\G" >> $tmpfile;
smail;
exit 0;
fi
done
for y in `mysql -u$user -p$passwd -e "show slave status\G" | grep Running | grep -ie "SQL" | awk '{print $2}'`
do
if [ $y != Yes ]; then
echo "$NOWTIME Error:Slave_SQL_Running is not Yes" >>$log
mhead;
mysql -u$user -p$passwd -e "show slave status\G" > $tmpfile;
smail;
exit 0;
fi
done
if [ "$Relay_Master_Log_File" != "" ];then
if [ $Master_Log -eq $Relay_Master_Log_File ];then
A=`expr $Master_Log_Pos - $Exec_Master_Log_Pos`
if [ $A -lt 0 ];then
A=`expr 0 - $A`
fi
echo $A>>$log
#echo "">>$log
if [ $A -lt 10000 ];then
echo "$NOWTIME Master-Slave is OK.">>$log
#echo "$i"
break
else
if [ $i ge 3 ];then
echo "$NOWTIME Warning:Slave-Master lag $A " >>$log
echo "$i"
fi
sleep 30
continue
fi
else
sleep 60
fi
if [ $i -eq 10 ];then
echo "$i"
echo "$NOWTIME Error:Slave-Master must be check !" >>$log
mhead
smail
fi
else
echo "$NOWTIME Error:不能获取slave的相关参数 " >>$log
mhead
smail
fi
done
复制代码
----------------------------------------------------------------------------------------------------------
感谢各位!问题已经找到,是环境变量的问题,我把所有的路径都换成绝对路径
比如:
slave=`mysql -u$user -p$passwd -e "show slave status\G;"|egrep "Relay_Master_Log_File|Exec_Master_Log_Pos|Seconds_Behind_Master|Slave_IO_Running|Slave_SQL_Running"`
复制代码
我换成
slave=`/usr/local/mysql/bin/mysql -u$user -p$passwd -e "show slave status\G;"|egrep "Relay_Master_Log_File|Exec_Master_Log_Pos|Seconds_Behind_Master|Slave_IO_Running|Slave_SQL_Running"`
复制代码
---------------------------------------------------------------------------------------------------------
作者:
wenhq
时间:
2013-04-17 12:51
第二行加set -xv
输出看下。
另外看下script的权限。
作者:
关阴月飞
时间:
2013-04-17 12:53
目测跟环境有关。。。。。
作者:
oyqiaojin
时间:
2013-04-17 12:57
什么环境?请明示。
回复
3#
关阴月飞
作者:
关阴月飞
时间:
2013-04-17 13:00
在脚本开始前引入一下环境变量试试:
#设置环境变量
. ~/.bash_profile
复制代码
作者:
oyqiaojin
时间:
2013-04-17 13:10
回复
2#
wenhq
在脚本的第二行加了 set -xv,执行脚本任务都不执行了,请问 set -xv是干什么用的?
是在root用户下添加的任务,脚本权限为-rwxr-xr-x. 这应该没问题。
作者:
todayhero
时间:
2013-04-17 13:21
@oyqiaojin
mysql主从监控为什么不使用nagios之类的工具为实现呢?
作者:
oyqiaojin
时间:
2013-04-17 13:24
回复
7#
todayhero
亲,我之前没弄过主从的监控,就写个脚本试试,像nagios之类的工具,能发现从断掉之后,主动发出警告吗?
作者:
todayhero
时间:
2013-04-17 13:34
@oyqiaojin
可以的,我是通过发邮件到189.cn邮件,收到邮件到后也可以开启189.cn邮箱的短信通知功能,去查看邮件。
作者:
wenhq
时间:
2013-04-17 13:35
本帖最后由 wenhq 于 2013-04-17 13:37 编辑
回复
6#
oyqiaojin
debug
你的加 set -xv
不是 set -xv,
最基本的错误.
#/bin/sh =====> #!/bin/sh
作者:
oyqiaojin
时间:
2013-04-17 13:50
回复
10#
wenhq
1、我是没加那个逗号的
2、发布问题的时候,不小心删了!,我机器上的脚本上有!的。
作者:
wenhq
时间:
2013-04-17 13:52
回复
11#
oyqiaojin
what about the output? still can't running? or else?
作者:
oyqiaojin
时间:
2013-04-17 14:02
回复
12#
wenhq
the crontab could‘t run now
作者:
wenhq
时间:
2013-04-17 14:06
查一下系统的cronlog。
是不是/var/log/cron
这个设置取决于/etc/syslog.conf的配置。
作者:
oyqiaojin
时间:
2013-04-17 14:09
回复
1#
oyqiaojin
感谢各位!问题已经找到,是环境变量的问题,我把所有的路径都换成绝对路径
比如:
slave=`mysql -u$user -p$passwd -e "show slave status\G;"|egrep "Relay_Master_Log_File|Exec_Master_Log_Pos|Seconds_Behind_Master|Slave_IO_Running|Slave_SQL_Running"`
复制代码
我换成
slave=`/usr/local/mysql/bin/mysql -u$user -p$passwd -e "show slave status\G;"|egrep "Relay_Master_Log_File|Exec_Master_Log_Pos|Seconds_Behind_Master|Slave_IO_Running|Slave_SQL_Running"`
复制代码
作者:
oyqiaojin
时间:
2013-04-17 14:26
回复
3#
关阴月飞
是环境的问题,但为什么现在任务都不执行了呢?
作者:
jack1007
时间:
2013-04-18 09:23
脚本开头source /etc/profile,就是导入下环境变量。
作者:
bikong0411
时间:
2013-04-18 09:42
crontab里面加上&>/tmp/log 看log是肿么回事
作者:
Shell_HAT
时间:
2013-04-18 13:16
回复
16#
oyqiaojin
1、检查一个运行crontab的那个用户的密码是否过期了
2、重启一下crond守护进程
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2