You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为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

火山引擎 最新活动