将filewatcher作为单独的进程运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将filewatcher作为单独的进程运行相关的知识,希望对你有一定的参考价值。

我还是Ruby的新手,所以我希望你能提供帮助。我有一个Ruby on Rails应用程序需要观看特定目录“Dir A”,我一直在添加txt文件。一旦出现新文件,它需要被处理成csv文件,然后在连接到用户之前出现在tmp目录中,并在文件进入ActiveStorage后从tmp中消失,同时将原始txt文件保留在“Dir A”中在有限的时间内。

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

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

我很抱歉有问题,但我需要一些指导,也许有一个我错过的更好的宝石,我看了看卫星宝石,但我不完全确定它是如何工作的,filewatcher似乎更简单。

答案

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

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

# 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),这样可以很容易地在生产中执行相同操作。

以上是关于将filewatcher作为单独的进程运行的主要内容,如果未能解决你的问题,请参考以下文章

将 Pyqt GUI 主应用程序作为单独的非阻塞进程运行

WPF App.OnStartup() 在写入文件和 FileWatcher 时崩溃

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程

使用 asyncio 将 bash 作为 Python 的子进程运行,但 bash 提示被延迟

ElectronJS应用程序将插件作为单独的进程加载

在单独的进程中运行代码