【问题标题】:shell script to trigger a command with every new line in to a file?shell脚本触发每个新行进入文件的命令?
【发布时间】:2013-09-19 10:37:32
【问题描述】:

是否可以在文件的每一行都触发命令?

例如:我有一个日志文件,比如 maillog。我想将每个新条目作为邮件发送到日志文件中。

如果像“Mail Sent”这样的新条目添加到邮件日志文件中,那么我的脚本应该 grep 新条目并向我发送带有条目(数据)的邮件。

我知道这很疯狂,但我想用这些东西自动化我的 Linux 机器。

问候,

【问题讨论】:

    标签: linux shell email logging


    【解决方案1】:

    没那么疯狂。通过存储文件的原始长度,定期检查(每小时一次,每天一次,你喜欢什么)文件中的新部分,比较长度,如果它已经增长,处理附加的部分:

    length=0
    while sleep 3600  # use wanted delay here
    do
      new_length=$(find "$file" -printf "%s")
      if [ $length -lt $new_length ]
      then
        tail --bytes=$[new_length-length] "$file" | handle_part
      fi
      length=$new_length
    done
    

    现在您只需编写 handle_part 函数,例如可以将其输入邮寄到某处。

    使用这种方式(而不是显而易见的tail -f)的优点是您可以将当前长度存储到文件中,然后在重新启动脚本时再次读取该长度。因此,在重新启动脚本后(例如,由于机器重新启动),您将无法获得整个文件。

    如果您想要更快的响应,您可以查看inotify,这是 Linux 上用于监控文件操作的工具;以便可以替换轮询。

    【讨论】:

    • 嗨 Alfe.. 谢谢它满足我的要求。我对代码进行了 2 处修改。
    • 如果 $[ $length -lt $new_length ] 它给出了语法错误。我删除了 $ 并尝试了 if [ $length -lt $new_length ]。它奏效了。
    • 第二个是更改第一个长度值以避免整个文件内容在邮件中发送...
    • 请原谅我有多个 cmets.... 再次感谢 Alfe 和 larsmans 的及时回复和帮助...
    • 是的,对,对不起,$ 在那里不合适(相应地编辑了我的解决方案)。如果一个答案适合你,你应该接受它。
    【解决方案2】:

    使用tail -f,它监视一个文件并将附加到它的任何内容发送到stdout。如果您有一个执行所需操作的脚本,例如mail_per_line,那么您可以将其设置为

    tail -f maillog | mail_per_line
    

    在这种情况下,mail_per_line 运行一次并获取所有行。如果您想在每次输入一行时生成一个单独的进程,请使用 shell 内置 read

    tail -f maillog | while IFS='' read line; do
        send_a_message "$line"
    done
    

    为了对抗 Alfe 所描述的效果,即重新启动该程序将导致重新处理之前的所有日志,请考虑使用 logrotate

    【讨论】:

    • 考虑出现几行的块。您的解决方案将在单独的邮件中发送它们,每封邮件仅包含一行。
    • @Alfe:是的,这正是 OP 的要求。
    • 如果你选择这样解释他——就这样吧。我发现理解他所说的可能是多行的“条目”更有趣,即使他想通过新行触发发送。
    • @Alfe 它非常明确:“触发一个命令,每个新行都进入 [sic] 一个文件”。对于更结构化的处理,我的第一个建议 + logrotate 可以是一个简单的解决方案。
    • 每个新行都可以触发它,最后仍然会发送整个块。但这不是重点。问题是用户可能想要什么,无论他如何用语言表达。
    猜你喜欢
    • 2013-03-27
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多