在新装的Linux服务器上部署了一个作业监控磁盘空间并提前告警,在shell脚本里面调用了一个perl脚本发送告警邮件。结果出现了一个很奇怪的现象:如果手工执行该脚本/home/oracle/scripts/disk_capatiy_alarm.sh能发出告警邮件,但是在crontab里面发现脚本没有发出告警邮件。检查了/var/log/cron后发现该作业执行了。最后发现shell执行了,但是perl脚本没有执行。搜索了相关资料后,了解到一般出现这种情况要么是因为环境变量,要么是因为使用了相对路径。因为crontab它总是不会缺省的从用户profile文件中读取环境变量参数,经常导致在手工执行某个脚本时是成功的,但是到crontab中试图让它定期执行时就是会出错.
我首先将perl ${email_content} 改成了使用绝对路径/usr/bin/perl ${email_content} ,测试依然不行
因此在脚本里面应用环境变量. /etc/profile 。 问题解决了。虽然寥寥几字,但是从问题纠结我开始到问题解决。基本上花费了半天时间。网上也有不少人碰到过这种情况。
参考资料: