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

时间:2019-05-16 21:38:01

标签: bash shell awk centos

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

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

我尝试使用cat and 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 btw上运行此脚本。

2 个答案:

答案 0 :(得分:1)

在您的awk脚本中,确保msg使其进入stdout:

print msg

然后在awk脚本之外添加:

| tee -a /var/log/server_mon.txt

答案 1 :(得分:1)

print msg | "cat>&2"正在将消息打印到stderr。您是否要将其打印到/var/log/server_mon.txt 代替 stderr或 stderr之外?

有很多选项,包括:

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

如果您不再需要print msg | "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)

这么多的选择。...