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
相关产品推荐
相关产品推荐

