每次在linux的目录中创建新文件时运行一个进程

Posted

技术标签:

【中文标题】每次在linux的目录中创建新文件时运行一个进程【英文标题】:Run a process each time a new file is created in a directory in linux 【发布时间】:2012-11-29 21:11:48 【问题描述】:

我正在开发一个应用程序。我使用的操作系统是linux。如果可能,我需要在目录中创建的文件上运行 ruby​​ 脚本。我需要让这个脚本始终运行。我首先想到的是inotify:

inotify API 提供了一种监控文件系统事件的机制。 Inotify 可用于监控单个文件,或监控目录。

这正是我所需要的,然后我找到了“rb-inotify”,它是一个 inotify 的包装器。

您认为有比使用 inotify 更好的方法来满足我的需要吗?另外,我真的不明白我必须使用 rb-inotify 的方式。

我只是创建了一个 rb 文件,例如:

notifier = INotify::Notifier.new
notifier.watch("directory/to/check",:create) do |event|
    #do task with event.name file
end

notifier.run

然后我只需要ruby myRBNotifier.rb,它会一直循环播放。我该如何阻止它?任何的想法?这是一个好方法吗?

【问题讨论】:

我该如何阻止它? ctrl-c It's exactly what I need - I need to keep this script running always... - How do I stop it? 不确定问题出在哪里? 【参考方案1】:

我建议查看god。它专为此类任务而设计,并且可以非常轻松地为后台和守护程序应用构建监控系统。

至于主要代码本身,inotify 不是跨平台的,因此如果您有可能需要在 Windows 或 Mac OS 上运行,那么您将需要不同的解决方案。编写一小段代码来定期检查目标目录是否有更改并不难。如果您需要知道发生了什么变化,请读取并缓存目录条目,然后在下次运行代码时进行比较。在运行之间使用sleep 以在循环之前等待一段时间。

做类似事情的老派方法是使用 cron 定期启动工作。该作业可以是您的脚本,它通过将文件列表与缓存版本进行比较来检查文件列表是否发生变化,然后在出现不同情况时根据需要采取行动。

【讨论】:

【参考方案2】:

只需在后台运行您的脚本

ruby myRBNotifier.rb &

当你需要停止它时,找到进程id并对其使用kill:

ps ux
kill [whatever pid your process gets from the OS]

这能回答你的问题吗?

【讨论】:

在后台运行它仅在会话连接时有效。如果用户注销或他们的会话终止,应用程序将被终止。 screen 可用于允许分离和重新连接,但这会使解决方案复杂化。【参考方案3】:

如果您在 mac/unix 机器上运行,请查看 launchctl man page。您可以设置一个进程以在文件更改时运行和执行 ruby​​ 脚本。它是高度可配置的。

【讨论】:

以上是关于每次在linux的目录中创建新文件时运行一个进程的主要内容,如果未能解决你的问题,请参考以下文章

linux 后台进程

如何在每次迭代中创建新向量?

在Solr中创建新核心时是否需要创建schema.xml?

Linux中创建新用户并赋给指定文件权限

为啥在其中创建新文件时目录的更改时间(ctime)会更改?

Linux中创建新用户并赋予指定目录的相关权限