将文件写入转移到进程

将文件写入转移到进程

我有一个无法更改的 OSX GUI 应用程序 - 它在完成作业时将新的 CVS 行写入日志文件。我想使用这些新的线路,但它们不断被添加。

有没有办法将应用程序的输出直接重定向到脚本中,然后我可以在脚本生成新行时对其进行处理?每 X 秒读取一次文件来获取更改是不可取的,虽然我可以用来launchd检测文件的更改并以这种方式处理它们 - 我正在寻找更优雅的东西。任何想法(带有示例 - 我正在学习)将不胜感激。

编辑

我不确定这是最好的方法,但我已经设法通过 tail 的 -F 标志获得即时结果。虽然我能够过滤最后一行,但它第一次运行时,当文件更新时,它会输出所有行,而不仅仅是最后一行(根据需要)。

tail -F -n 2 '/path/to/Epson4880_audit.txt' | grep "."

答案1

您可以用 FIFO 替换输出文件,并使其他程序从中获取输入。

例如:

mkfifo Epson4880_audit.txt
# launch your program
grep "." Epson4880_audit.txt

请注意,这不能保证有效。某些程序检查其输出是否是真实文件。如果您确实想保留行日志,第二个进程必须确保在行到达时将其打印出来。例如做tee real_Epson4880_audit.txt | grep ".".另请注意,如果没有第二个程序,您将无法启动第一个程序,因为第一个进程将被迫等待读者。如果您想运行第一个程序而不运行第二个程序,则必须先删除 FIFO。

答案2

大多数操作系统都有一个功能,您可以在其中订阅文件上的活动。在 Linux 中,此功能内置于内核中,称为 iNotify。您可以按照这些思路创建一些内容来监视文件的活动,然后处理这些更新。

以下是一些可帮助您开始了解 iNotify 的资源:

即使这些页面显示 C/C++ 代码,您也不必开发自己的工具来与其交互。您可以使用命令行工具来订阅文件和/或目录,然后接收通知。

笔记:在 OSX 上,您将使用类似的东西kqueue。我发现这个帖子在 Stack Overflow 上讨论了很多选项,标题为:Mac 上有类似“watch”或“inotifywait”的命令吗?

有些工具提供与inotifywaitOSX 类似的功能,例如launchd,kqwait,fswatch或者watchdog

您可以采取的另一种方法是查看 Nagios 等监控工具如何监控日志文件的活动。 Nagios 有大量插件可以完全满足您的需求。其中一些仅监视文件的活动,而另一些则监视文件的特定字符串。看一下插件页面。

Nagios 插件 - 类别:日志文件

相关内容