1

是否可以在文件中的每个新行触发命令?

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

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

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

问候,

4

2 回答 2

3

使用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

于 2013-09-19T10:43:41.537 回答
3

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

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)的优点是您可以将当前长度存储到文件中,然后在重新启动脚本时再次读取该长度。因此,在重新启动脚本后(例如,由于机器重新启动),您将无法获得整个文件。

如果您想要更快的响应,您可以查看inotifyLinux 上哪个是监视文件操作的工具;以便可以更换轮询。

于 2013-09-19T10:44:39.857 回答