UNIX定时Shell脚本邮件输出变量数据不显示问题求助
问题分析与解决方案
这问题我之前排查过好几个类似案例,核心原因是定时任务的执行环境和你手动运行脚本时的环境不一致,具体来说是工作目录的差异导致的,咱们一步步理清楚:
1. 最可能的问题:相对路径找不到文件
你手动运行脚本时,大概率是在/home/user目录下执行的,所以grep -c "running" MailLog.txt能正常找到文件并统计行数。但定时任务默认的工作目录是根目录(/),当脚本执行到这行时,它会去/目录下找MailLog.txt——显然这个文件不存在,所以rn和sp两个变量会被赋值为空字符串,最终邮件里就显示空白了。
修复方法:把所有文件路径改成绝对路径
修改脚本里的这两行:
# 原来的相对路径写法 # rn=`grep -c "running" MailLog.txt` # sp=`grep -c "stopped" MailLog.txt` # 改成绝对路径 rn=$(grep -c "running" /home/user/MailLog.txt) sp=$(grep -c "stopped" /home/user/MailLog.txt)
这里顺便把反引号换成$(),这是更推荐的命令替换写法,可读性和兼容性更好。
2. 额外的环境变量小建议(可选但保险)
定时任务的PATH环境变量比你手动登录时要精简很多,虽然你现在能收到邮件,但为了避免后续其他命令出问题,可以:
- 用
which mailx查一下mailx的绝对路径(比如/usr/bin/mailx),然后把脚本里的mailx换成这个绝对路径; - 在定时任务的条目里指定脚本的绝对路径,比如crontab里的内容应该是:
# 示例:每天8点执行脚本 0 8 * * * /bin/bash /home/user/your_monitor_script.sh
3. 验证方法
你可以在脚本里加一行输出当前工作目录的日志,方便排查:
echo "Current working directory: $(pwd)" >> /home/user/debug.log
执行定时任务后看debug.log,就能确认工作目录是不是根目录了。
内容的提问来源于stack exchange,提问作者TheKoolhatkar
相关产品推荐
相关产品推荐

