如何使用Bash读取文件并按日期条件触发邮件发送操作?
Linux虚拟机超期提醒Bash脚本实现
前置准备
- 系统需提前安装邮件发送工具,推荐
mailx,CentOS可执行yum install mailx -y安装,Debian/Ubuntu可执行apt install bsd-mailx -y安装 - 确保服务器网络可以正常发送外部邮件
实现脚本
将以下内容保存为vm_expire_notify.sh:
#!/bin/bash # 请修改为你的虚拟机记录文件实际路径 VM_RECORD_FILE="/opt/vm_running_record.txt" # 30天对应的秒数 THIRTY_DAYS_SEC=$((30*24*3600)) # 当前系统时间戳 CURRENT_TS=$(date +%s) # 逐行读取记录文件 while read -r line; do # 跳过空行 [ -z "$line" ] && continue # 提取记录时间和通知邮箱字段 record_time=$(echo "$line" | awk '{print $1}') target_email=$(echo "$line" | awk '{print $5}') # 把记录的ISO格式时间转成时间戳,转换失败直接跳过该行 record_ts=$(date -d "$record_time" +%s 2>/dev/null) [ $? -ne 0 ] && continue # 计算当前时间和记录时间的差值 time_gap=$((CURRENT_TS - record_ts)) # 时间差小于30天则发送提醒邮件 if [ $time_gap -lt $THIRTY_DAYS_SEC ]; then echo "您的虚拟机使用时长已超过5天,请及时关机处理" | mail -s "您的虚拟机已超期" "$target_email" echo "已向${target_email}发送超期提醒" fi done < "$VM_RECORD_FILE"
使用方法
- 替换脚本中
VM_RECORD_FILE的取值为你自己的txt记录文件绝对路径 - 给脚本添加执行权限:
chmod +x vm_expire_notify.sh - 手动测试执行:
./vm_expire_notify.sh - 如需定时自动执行,可添加到crontab,示例每天凌晨1点执行:
执行crontab -e后添加如下规则:
0 1 * * * /path/to/vm_expire_notify.sh >> /var/log/vm_notify.log 2>&1
注意事项
- 如果需要配置发件人信息,可编辑
/etc/mail.rc添加smtp配置,示例如下:
set from=你的发件邮箱 smtp=smtp.邮箱服务商.com smtp-auth-user=发件邮箱账号 smtp-auth-password=邮箱授权码 smtp-auth=login
- 正式使用前建议先把发邮件的命令替换为echo打印,确认时间筛选逻辑符合预期后再开启真实发信,避免误发邮件。
内容的提问来源于stack exchange,提问作者user202304
相关产品推荐
相关产品推荐

