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

最近有个需求,就是定时检查一个数据库表格中的条目,一旦条目增加及时报告给管理员来处理。于是,我想到了用一个脚本来实现数据的获取、比对、处理和邮件发送(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的可执行文件的位置。

因此,脚本中使用的命令尽量使用绝对路径,防止出现不必要的麻烦。

你可能感兴趣的:(Linux,MySQL)