bash - 在我的脚本中创建通过电子邮件发送的内容的日志

标签 bash shell awk centos

此脚本当前监视关键字的日志文件。在发现所述关键字后,脚本会生成一条关于服务器状态(启动或关闭)的消息。然后它直接向我输出一封电子邮件。脚本的其余部分只是在预定的时间段后终止脚本。

最后,我现在想做的是将发送到电子邮件的相同信息发送到日志文件:emailoutput >/var/log/server_mon.txt

我曾尝试使用 cat 和 exec 命令将打印的消息定向到一个文件,但我的语法每次都是错误的。不是真正的程序员,也不确定如何或在何处应用该命令。我的猜测是在“打印”之后的某个地方,但又不确定如何。

#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

tail -fn0 /var/log/user | /usr/bin/awk '
    /disconnect_tcp_conn/ { report("down") }
    /daemon apps started/  { report("up") }

    function report(curr_state,    msg) {
        if ( prev_state != curr_state ) {
            msg = "Server is " curr_state
            system("mail -s \047" msg "\047 mail@gmail.com </dev/null")
            print msg | "cat>&2"
            prev_state = curr_state
        }
    }
'

 &
PID=$!

DIEAT=`expr $SECONDS + 58`
while [ -d /proc/$PID ] && [ "$SECONDS" -lt "$DIEAT" ]
do
        sleep 1
done

[ -d /proc/$PID ] && kill "$PID"
wait

预期结果是将内容输出到电子邮件、文本文件,以便跟踪脚本报告服务器状况的频率。

顺便说一句,我在 centos 5.5 上运行这个脚本..

最佳答案

打印消息 | “cat>&2” 正在将消息打印到 stderr。你想将它打印到 /var/log/server_mon.txt 而不是 stderr 还是除了 stderr?

有很多选项,包括:

awk '
    ...
    print msg | "cat>&2"
    print msg > "/var/log/server_mon.txt"
    ...
'

删除打印消息 | "cat>&2" 如果您不再需要它。

或者通过一个print获得两者:

awk '
    ...
    print msg | "tee -a \047/var/log/server_mon.txt\047 >&2"
    ...
'

或:

awk '
    ...
    print msg
    ...
' | tee -a '/var/log/server_mon.txt' >&2

或:

awk '
    ...
    print msg | "cat>&2"
    ...
' 2> >(tee -a '/var/log/server_mon.txt' >&2)

这么多选择....

关于bash - 在我的脚本中创建通过电子邮件发送的内容的日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56176924/

相关文章:

linux - 用于查找硬件信息的 Bash 脚本给出 "Memory Fault"

linux - 输入新的 bash 实例时 .bashrc 是否运行两次?

regex - Unix 命令在匹配模式后打印数据的第二部分

unix - awk 哈希在两个输入文件上应用条件

linux - 从/proc/返回信息的脚本

mysql - Ubuntu docker sh mysql脚本运行

linux - 如何检查父目录 bash 中是否存在给定的目录名称

shell - 如何将 stdout 重定向到变量并将 stderr 重定向到 ubuntu 中的文件?

linux - awk 在循环中使用时不打印任何内容

linux - 如何从 bash 获取平均 CPU 温度?