【问题标题】:Create a log of what's being sent by email in my script在我的脚本中创建通过电子邮件发送的内容的日志
【发布时间】:2019-10-04 05:25:20
【问题描述】:

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

最后,我现在想做的是将要发送到电子邮件的相同信息发送到日志文件: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 btw 上运行这个脚本..

【问题讨论】:

  • print msg | "cat&gt;&amp;2" 正在将消息打印到 stderr。您要将其打印到/var/log/server_mon.txt而不是 stderr 还是除了 stderr?
  • 代替.. 但除此之外也不错,因为大多数情况下此脚本将作为 cron 作业运行。

标签: bash shell awk centos


【解决方案1】:

print msg | "cat&gt;&amp;2" 正在将消息打印到标准错误。您要将其打印到/var/log/server_mon.txt而不是 stderr 还是除了 stderr?

有很多选择,包括:

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

如果您不再需要 print msg | "cat&gt;&amp;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)

这么多选择....

【讨论】:

  • 可以给每个条目加个时间戳比较简单吗?
  • 使用 GNU awk 是的,但使用其他 awk 就没有那么多了。发布一个新问题。
  • 刚刚发布了一个关于时间戳的新问题,但是,我刚刚意识到日志文件的输出报告了相反的状态,然后电子邮件通知的状态是正确的(服务器启动/下来)..关于为什么的任何想法?我替换了:打印味精| "cat>&2" 与:打印味精 | “tee -a \047/var/log/server_mon.txt\047 >&2”。我也可以就此发表新帖子,但我认为它可能与当前帖子相关。
  • 我的错误。我说错了
【解决方案2】:

在你的 awk 脚本中确保 msg 进入标准输出:

print msg

然后在你的 awk 脚本之外添加:

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

【讨论】:

  • 好的,明天试试
  • 这也有效,我看到 tee 命令允许日志和屏幕都获取消息。 ty
猜你喜欢
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
相关资源
最近更新 更多