Bash 创建内容的日志';在我的脚本中,它是通过电子邮件发送的

Bash 创建内容的日志';在我的脚本中,它是通过电子邮件发送的,bash,shell,awk,centos,Bash,Shell,Awk,Centos,此脚本当前监视日志文件中的关键字。在发现所述关键字后,脚本随后生成与服务器状态(向上或向下)相关的消息。然后它直接向我输出一封电子邮件。脚本的其余部分只是在预定的时间段后终止脚本 最后,我现在要做的是将发送到电子邮件的相同信息发送到日志文件:emailoutput>/var/log/server_mon.txt 我曾尝试使用cat和exec命令将打印的消息定向到文件,但每次我的语法都是错误的。不是真正的程序员,也不确定如何或在哪里确切地应用该命令。我猜是在“打印”之后的某个地方,但又一次,不确定

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

最后,我现在要做的是将发送到电子邮件的相同信息发送到日志文件: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
#/bin/bash
路径=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
tail-fn0/var/log/user |/usr/bin/awk'
/断开\u tcp\u conn/{report(“down”)}
/守护程序应用程序已启动/{report(“up”)}
功能报告(当前状态,消息){
如果(上一个状态!=当前状态){
msg=“服务器为”当前状态
系统(“邮件-s\047”msg”\047mail@gmail.com &2"
上一状态=当前状态
}
}
'
&
PID=$!
DIEAT=`expr$SECONDS+58`
而[-d/proc/$PID]&&&[“$SECONDS”-lt“$DIEAT”]
做
睡眠1
完成
[-d/proc/$PID]&&kill“$PID”
等待
预期结果是将内容输出到电子邮件和文本文件,以便跟踪脚本报告服务器状况的频率


我正在centos 5.5 btw上运行此脚本。

在您的awk脚本中,确保msg将其发送到标准输出:

print msg
然后在awk脚本之外添加:

| tee -a /var/log/server_mon.txt
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”

或者通过一个
打印
来获得这两个:

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

或:


有这么多选项……

Ok明天会尝试,这也可以,我看到tee命令允许log和screen获取消息。ty
print msg |“cat>&2”
正在将消息打印到stderr。是否要将其打印到
/var/log/server_mon.txt
而不是stderr或stderr?而是..但是另外也不会太坏,因为大部分时间此脚本都将作为cron作业运行。是否可以将时间戳添加到每个条目中相对简单?使用GNU awk是的,w其他AWK没有那么多。发布一个新问题。只是发布了一个新的时间戳问题,但是,我刚刚意识到日志文件的输出报告了与电子邮件通知相反的状态,电子邮件通知是正确的状态(服务器上/下)…有什么想法吗?我替换了:print msg |“cat>&2”使用: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)