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