是否可以在文件中的每个新行触发命令?
例如:我有一个日志文件说 maillog。我想将每个新条目作为邮件发送到日志文件中。
如果像“Mail Sent”这样的新条目添加到邮件日志文件中,那么我的脚本应该 grep 新条目并向我发送带有条目(数据)的邮件。
我知道这很疯狂,但我想用这些东西自动化我的 Linux 机器。
问候,
使用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。
没那么疯狂。通过存储文件的原始长度,定期检查(每小时一次,每天一次,你喜欢什么)文件中的新部分,比较长度,如果它已经增长,处理附加的部分:
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 上哪个是监视文件操作的工具;以便可以更换轮询。