如何为Shell脚本配置邮件?实现Sqoop作业日志多邮箱推送
嘿,刚好我之前帮团队处理过类似的Sqoop日志邮件通知需求,这就给你一步步拆解怎么实现:
1. 先搞定系统邮件工具
首先得确保你的服务器上装了mailx或者sendmail,这俩是Shell脚本发邮件的常用工具。你可以先敲which mailx看看有没有,要是没返回路径,就装一个:
- CentOS/RHEL系:
sudo yum install mailx - Ubuntu/Debian系:
sudo apt install mailutils(Ubuntu里的mailx是mailutils包的一部分)
2. 核心实现思路
我们要达成的目标其实分三步:
- 把Sqoop作业的所有日志(成功/失败的输出都要)抓下来
- 加上你自定义的正文内容(比如作业说明、告警提示)
- 把这些打包发给多个指定邮箱
3. 完整可复用脚本示例
直接上代码,我给你加了详细注释,你替换成自己的参数就行:
#!/bin/bash # -------------------------- 配置参数区 -------------------------- # 多个邮箱用逗号/空格分隔都可以,mailx支持这种格式 RECIPIENTS="dev-team@example.com,ops@example.com,your-name@example.com" # 邮件主题,自动带上执行时间,方便排查 SUBJECT="Sqoop数据同步作业结果 - $(date +%Y-%m-%d_%H:%M:%S)" # 自定义正文内容,比如作业说明、提醒语 CUSTOM_CONTENT="各位好:\n以下是今日用户数据同步Sqoop作业的完整日志,请查收:\n\n" # -------------------------- 配置参数区结束 -------------------------- # 执行Sqoop作业,同时捕获所有输出(标准输出+错误输出) SQOOP_LOG=$(sqoop import \ --connect jdbc:mysql://db-server:3306/user_db \ --username db_user \ --password db_pass \ --table user_info \ --target-dir /hdfs/data/user_info \ --delete-target-dir \ 2>&1) # 关键:2>&1把错误输出合并到标准输出,确保日志完整 # 判断Sqoop作业执行状态 if [ $? -eq 0 ]; then SUBJECT="${SUBJECT} ✅ 执行成功" else SUBJECT="${SUBJECT} ❌ 执行失败" # 失败时追加告警提示,让收件人一眼注意到 CUSTOM_CONTENT="${CUSTOM_CONTENT}⚠️ 重要提醒:Sqoop作业执行失败,请尽快排查问题!\n\n" fi # 拼接内容并发送邮件 echo -e "${CUSTOM_CONTENT}${SQOOP_LOG}" | mailx -s "${SUBJECT}" ${RECIPIENTS}
4. 进阶优化技巧
处理大日志场景
如果Sqoop日志特别大,用变量存可能会有问题,建议先写到临时文件再发送:
# 把Sqoop日志写到临时文件 sqoop import ... > /tmp/sqoop_job_$(date +%Y%m%d).log 2>&1 # 拼接自定义内容和日志文件,发送邮件 echo -e "${CUSTOM_CONTENT}" | cat - /tmp/sqoop_job_$(date +%Y%m%d).log | mailx -s "${SUBJECT}" ${RECIPIENTS} # 可选:发送完删除临时文件 rm /tmp/sqoop_job_$(date +%Y%m%d).log
配置SMTP服务器(云服务器必备)
像阿里云、腾讯云这类云服务器默认禁用25端口,直接发邮件会失败,需要配置第三方SMTP(比如QQ邮箱、163邮箱):
编辑/etc/mail.rc(CentOS)或者/etc/nail.rc(Ubuntu),添加以下内容(替换成你的邮箱信息):
# 发件人邮箱 set from=your-alert@163.com # SMTP服务器地址和端口(163的是smtp.163.com:587,QQ的是smtp.qq.com:587) set smtp=smtp.163.com:587 # SMTP认证用户名(就是你的发件人邮箱) set smtp-auth-user=your-alert@163.com # SMTP认证密码(注意:163/QQ邮箱要用授权码,不是登录密码) set smtp-auth-password=your-email-auth-code # 认证方式 set smtp-auth=login
发送附件
如果需要把日志作为附件发送,用mailx -a参数就行:
echo -e "${CUSTOM_CONTENT}" | mailx -a /tmp/sqoop_job.log -s "${SUBJECT}" ${RECIPIENTS}
5. 测试脚本
写完别着急丢去定时任务,先手动执行测试:
- 先把Sqoop命令换成一个错误命令(比如
ls /non-existent-path),测试失败场景的邮件 - 再换成正常的Sqoop命令,测试成功场景的邮件
- 确认所有收件人都能收到邮件,格式符合预期
内容的提问来源于stack exchange,提问作者Ravikiran




