You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本检查NFS挂载时mail命令需按CTRL+D问题的解决求助

解决Bash脚本中mail命令挂起的问题

嗨,我来帮你搞定这个问题~ 你的脚本里mail命令会挂起,核心原因是默认情况下mail命令会等待你从标准输入(stdin)输入邮件正文,如果没提供内容,它就会一直停在那里,直到你按Ctrl+D结束输入。要让脚本自动完成邮件发送,你得主动给mail命令提供邮件内容,不用手动输入。

下面给你几种实用的解决方案,还有优化后的完整脚本:

方法1:用echo通过管道传递单行正文

这是最简洁的方式,把邮件内容用echo输出后通过管道传给mail:

echo "Netapp NFS Share ${FS} is mounted successfully." | mail -s "Netapp NFS Share is mounted" $mailto1

方法2:用Here字符串(<<<)传递单行内容

如果邮件内容是单行的,用Here字符串写法更清爽:

mail -s "Netapp NFS Share is mounted" $mailto1 <<< "Netapp NFS Share ${FS} is mounted successfully."

方法3:用Here文档传递多行详细内容

如果需要发送更完整的信息(比如挂载点、检查时间),可以用Here文档,支持多行内容:

mail -s "Netapp NFS Share is mounted" $mailto1 << EOF
Netapp NFS Share Status: Mounted
Mount Point: ${FS}
Check Time: $(date)
EOF

优化后的完整脚本

我还帮你优化了挂载点的获取逻辑(去掉多余的cat和sed,用awk直接过滤),让脚本更高效,同时给未挂载的情况也加上了邮件告警:

#!/bin/bash
#set -x
mailto1=abc@test.com

# 获取NetApp挂载点(跳过前7行,排除注释、空行和swap项)
netapp_nfs_share=$(awk '$1 !~ /#|^$|swap/ && NR>7 {print $2}' /etc/fstab)

# 逐一检查每个挂载点状态
for FS in ${netapp_nfs_share}
do
    if df -hPT | grep -wq ${FS}; then
        # 发送挂载成功的通知邮件
        mail -s "✅ Netapp NFS Share is mounted" $mailto1 << EOF
Netapp NFS Share Status: Mounted Successfully
Mount Point: ${FS}
Check Timestamp: $(date "+%Y-%m-%d %H:%M:%S")
EOF
    else
        # 发送挂载失败的告警邮件
        mail -s "❌ Netapp NFS Share is NOT mounted" $mailto1 << EOF
Netapp NFS Share Status: NOT Mounted
Mount Point: ${FS}
Check Timestamp: $(date "+%Y-%m-%d %H:%M:%S")
EOF
        echo "Netapp NFS share ${FS} is not mounted"
    fi
done

这样修改后,脚本运行时mail命令就不会再挂起,会自动发送带内容的邮件啦~

内容的提问来源于stack exchange,提问作者frodo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:33:40