运行 filewatcher 作为单独的进程

Running filewatcher as separate process

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

现在,我正在使用 filewatcher gem 来监视 "Dir A" ,但是我需要它在服务器启动时 运行 并在后台继续 运行 。我知道我需要守护进程,但我怎样才能从 *.rb 文件而不是终端来做到这一点? Atm 我正在使用 Threads,但我不确定这是否是最佳解决方案...

我还有以下问题: - 如何处理服务器启动前已经出现在文件夹中的文件? - filewatcher 在处理前一个文件时似乎没有接收到另一个新文件,线程似乎对此无济于事 - 你会推荐什么是跟踪已处理文件的最佳方式 - 数据库,或 renaming/copying 文件到不同的文件夹,或一些全局变量,或者可能还有其他东西?我必须知道处理了哪些文件,因此在由于性能下降而需要安排 filewatcher 重新启动的情况下,我不会特别重复该过程(filewatcher 文档指出,如果它已经很长时间,最好重新启动该过程-运行宁)

我很抱歉提出问题,但我需要一些指导,也许有更好的 gem 我错过了,我看了 guard gem 但我不完全确定如何它有效并且 filewatcher 看起来更简单。

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

您可以在一个进程中启动您的 Rails 应用程序,在另一个进程中启动 filewatcher,在应用程序的根目录中使用 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),这使得在生产中做同样的事情变得容易。