While Read 循环发送至电子邮件

While Read 循环发送至电子邮件

我正在编写的脚本有问题。我正在尝试监视可用磁盘空间,并为超过特定阈值的每个文件系统生成一封电子邮件。当将此脚本与“echo”而不是“mail”一起使用时,输出在我的终端上看起来是正确的。当我合并邮件时,仅发送严重警告,并且电子邮件正文包括其他文件系统。我正在尝试为每个文件系统发送单独的电子邮件。我不是在寻找答案,但也许是某个值得关注的地方来尝试确定我的问题是什么。

 #!/bin/bash
    #The following script will check filesystems (local/nfs only)
    #and notify via email current user if over certain threshold.

    #Thresholds for script to call
    CRITICAL=90
    ALERT=70

    #Gets local/nfs disk info, greps out header/tmp filesystems and awks column 1 and 5
    #while read loop is enabled to parse through each line
    df -l | grep -vE '(^Filesystem)' | awk '{ print ($5  " " $1)}' | while read output;
    do
        #updates variables to reads current step
        usage=$( echo $output | awk '{print $1}' | cut -d'%' -f1 )
        part=$( echo $output | awk '{print $2}' )

        #if percentage matches alert or critical, email current user
        if [ $usage -ge $CRITICAL ]; then
            mail -s "Critical Warning: Filesystem $part is at $usage% of capacity." $USER
        elif [ $usage -ge $ALERT ]; then
            mail -s "Warning: Filesystem $part is at $usage% of capacity." $USER
        fi
    done

答案1

您的mail命令期望其消息位于 STDIN 上,因此读取df ... awk管道生成的输出的其余部分。

如果您确实不想在邮件中包含任何消息正文,只需通过管道传输 STDIN /dev/null

mail -s "Critical Warning: Filesystem $part is at $usage% of capacity." $USER </dev/null

答案2

如上所述,邮件需要某种 stdin 数据或 /dev/null 以防止其获取 stdio。

但也许您可能希望在邮件正文中包含更多有助于诊断问题的信息,而不是空数据。此示例添加了额外的数据标记。 (对于避免错误配置的邮件转发器弄乱邮件标头中的时间戳总是有用的)所有磁盘上的完整 df 报告,而不仅仅是问题磁盘,以及当前进程的快照,如果磁盘空间已满,这可能会很有用通过失控的进程。

Example:
mail -s "Critical Warning: Filesystem $part is at $usage% of capacity." $USER << EOM

Critical Report Generated `date`
Disk status:
`df -h`
Process Status: 
`top -b -n 1'
EOM

相关内容