将Filewatcher作为单独的进程运行

时间:2019-03-06 20:29:10

标签: ruby-on-rails rubygems daemon file-watcher

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

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

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

很抱歉提出问题,但我需要一些指导,也许我错过了更好的宝石,我看了守卫宝石,但我不确定是如何工作的,而且Filewatcher看起来更简单。

1 个答案:

答案 0 :(得分:0)

这个问题可能应该分为两个,一个是关于将filewatcher作为后台进程运行,另一个是关于管理已处理的文件,但是就filewatcher而言,一种简单的解决方案是使用foreman宝石和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),那么在生产中就很容易做到这一点。