首页 > 解决方案 > 将 filewatcher 作为单独的进程运行

问题描述

我对Ruby还是很陌生,所以我希望你能提供帮助。我有一个 Ruby on Rails 应用程序,它需要监视一个特定的目录“Dir A”,我不断向其中添加 txt 文件。一旦出现新文件,需要将其处理为 csv 文件,然后在附加到用户之前出现在 tmp 目录中,并在文件进入 ActiveStorage 后从 tmp 中消失,同时将原始 txt 文件保留在“Dir A”中在有限的时间内。

现在,我正在使用 filewatcher gem 来观看 "Dir A" ,但是我需要它在服务器启动时运行并继续在后台运行。我知道我需要守护进程,但是如何从 *.rb 文件而不是终端执行它?Atm 我正在使用线程,但我不确定这是否是最好的解决方案......

我也有以下问题: - 如何在服务器启动之前处理已经出现在文件夹中的文件?- filewatcher 似乎在处理前一个文件时没有拾取另一个新文件,并且线程似乎对此没有帮助 - 您建议使用什么来跟踪已处理文件的最佳方法 - 数据库,或将文件重命名/复制到不同的文件夹,或者一些全局变量,或者可能还有其他东西?我必须知道处理了哪些文件,因此当我需要安排 filewatcher 重新启动由于其性能下降时,我不会特别重复该过程(filewatcher 文档指出,如果它已经长时间运行,最好重新启动该过程)

很抱歉提出问题,但我需要一些指导,也许我错过了更好的 gem,我查看了 guard gem,但我不完全确定它是如何工作的,而且 filewatcher 似乎更简单。

标签: ruby-on-railsrubygemsdaemonfile-watcher

解决方案


这个问题可能应该分为两个,一个关于filewatcher作为后台进程运行,另一个关于管理已处理的文件,但就目前filewatcher而言,一个简单的解决方案是将foremangem 与 Procfile 一起使用。

您可以在一个进程中启动 Rails 应用程序,并在另一个进程中启动文件监视程序,并在应用程序的根目录中使用 Procfile,如下所示:

# Procfile
web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}
filewatcher: filewatcher "**/*.txt" "bundle exec rake process_txt_files"

并将需要完成的任何处理移动到 rake 任务中。有了这个,你可以在foreman start本地运行来启动两个进程,如果你的生产服务器支持 Procfiles(例如 Heroku),这使得在生产中做同样的事情变得很容易。


推荐阅读