最近有个需求,就是定时检查一个数据库表格中的条目,一旦条目增加及时报告给管理员来处理。于是,我想到了用一个脚本来实现数据的获取、比对、处理和邮件发送(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的可执行文件的位置。
因此,脚本中使用的命令尽量使用绝对路径,防止出现不必要的麻烦。
