Bash脚本邮件功能异常求助:VoIP SIP中继监控脚本无法发信
好的,咱们一步步来排查这个邮件告警的问题——既然手动测试email -s "test" me@me.com能正常发信,那大概率是脚本里的调用逻辑、运行环境或者触发条件出了问题,咱们从这几个方向逐一排查:
排查Bash脚本邮件发送故障的具体步骤
1. 先核对脚本里的邮件命令写法
首先确认脚本里调用邮件的代码和你手动测试的逻辑完全一致:
- 有没有把命令写错?比如手动用的是
email,脚本里误写成了mail或者sendmail? - 主题参数
-s有没有漏?收件人地址格式是不是和测试时完全一样? - 如果要把
/tmp/checkpeers的日志作为邮件正文,有没有正确传递内容?比如应该用管道读取:
而不是直接把文件名当参数丢给cat /tmp/checkpeers | email -s "SIP中继不可用告警" me@me.comemail命令。
2. 检查脚本的运行环境变量
手动执行命令是在你的个人用户环境,但脚本可能是通过cron或者root用户运行的,环境变量差异会导致命令找不到:
- 先执行
which email找到命令的绝对路径(比如/usr/bin/email),然后在脚本里写全路径调用,避免环境变量找不到命令的问题:/usr/bin/email -s "SIP中继告警" me@me.com < /tmp/checkpeers - 切换到脚本运行的用户(比如
sudo -u root bash),手动执行一遍邮件命令,看能不能正常发送——如果切换后发不了,说明该用户的邮件配置有问题。
3. 给脚本加错误日志定位问题
在脚本的邮件发送命令后面加上错误重定向,把执行时的报错信息存下来:
cat /tmp/checkpeers | email -s "SIP中继告警" me@me.com >> /tmp/email_debug.log 2>&1
之后查看/tmp/email_debug.log,里面会有具体的错误提示,比如权限不足、命令不存在、收件人格式错误等,这是最快定位问题的方法。
4. 确认告警触发逻辑是否真的执行了
有时候不是邮件发不出,而是告警根本没被触发:
- 检查脚本里判断中继不可用的逻辑是不是正确?比如有没有正确解析
/tmp/checkpeers里的状态内容,判断条件有没有写反? - 手动模拟中继不可用的场景,直接运行脚本,看邮件命令有没有被执行到——比如在脚本里加一行
echo "开始发送告警邮件",运行后看这行日志是否输出。
5. 如果用cron定时运行,检查cron的环境和日志
cron的运行环境和用户环境差异很大,容易踩坑:
- 查看cron日志(通常在
/var/log/cron或者/var/log/syslog里搜索cron关键词),看脚本有没有被执行,有没有报错信息。 - 在脚本开头手动设置环境变量,避免cron默认PATH太窄找不到命令:
#!/bin/bash # 手动设置环境变量 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 或者导入用户的环境配置 source /home/your_user/.bash_profile
你可以先从这几个方向排查,要是能把脚本里的邮件相关代码或者错误日志贴出来,能更快精准定位问题。
内容的提问来源于stack exchange,提问作者user313162
相关产品推荐
相关产品推荐

