您的位置:首页 > 运维架构 > Shell

shell中执行没有问题的脚本,交给cron后出错,如何解决?

2017-06-08 16:16 531 查看
最近有个需求,就是定时检查一个数据库表格中的条目,一旦条目增加及时报告给管理员来处理。于是,我想到了用一个脚本来实现数据的获取、比对、处理和邮件发送(139邮箱可以设置免费短信报警,很实用的功能)。

脚本如下:

#!/bin/bash
# 脚本:获取数据库表中的条目数,一旦增加邮件报警。

mysql=/usr/local/mysql/bin/mysql
# 取到id段的内容
a=`$mysql -e "SELECT id FROM db_lius.tb_lius;"`
# 过滤得到id段的最后一个值,(id有自动加1的机制,最后的肯定是更大的数字)
b=`echo $a | awk '{print $NF}'`
# 获取到以前的id字段的最后一个值
c=`cat /home/lius/kid.txt`

if [ $b -ne $c ]; then
echo $b >| /home/lius/kid.txt
cat /home/lius/management/massage.txt | mail -s "有新的条目更新" 13535353535@139.com
if  [ `echo $?` -eq 0 ]; then
echo "`date +%F\ %H:%M:%S`:执行成功"
else
echo "`date +%F\ %H:%M:%S`: 邮件发送失败,请检查"
fi
else
echo "`date +%F\ %H:%M:%S`: 无条目更新,略过。。。"
fi


注释:

在/home/lius/management/massage.txt 中,是发送给139邮箱的正文信息,直接读取用mail命令来发送;

/home/lius/kid.txt 中,是上一次获取到的数据库条目数字,默认数据库表中有id字段;

crontab任务:

1 * * * * cd /home/lius/management && ./lius.sh 2>> /home/lius/management/kid.cron.err 1>> /home/lius/management/kid.cron.log


每一小时执行一遍脚本,错误和正确的输出信息都记录日志。

出现的问题:

一开始的时候,脚本中没有:

mysql=/usr/local/mysql/bin/mysql


而是直接用mysql来运行的。

cron任务中也是用绝对路径来执行的:

1 * * * * /home/lius/management/lius.sh 2>> /home/lius/management/kid.cron.err 1>> /home/lius/management/kid.cron.log


开始脚本在shell中运行没有出现问题,在cron任务设定以后,每次执行都有问题。

网上有帖子说是权限问题,因此按照他的建议改为了:

cd /home/lius/management && ./lius.sh


然而问题依然存在,是和mysql相关的错误提示。于是,将脚本中的mysql改成了绝对路径:

mysql=/usr/local/mysql/bin/mysql


然后用$mysql来引用,果然问题就解决了。

估计的原因是cron后台进程无法在PATH中找到mysql的可执行文件的位置。

因此,脚本中使用的命令尽量使用绝对路径,防止出现不必要的麻烦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql cron 139邮箱