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

时间:2012-11-29 21:11:49

标签: ruby linux inotify

我正在开发一款应用。我使用的操作系统是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,它将永远保持循环。我怎么阻止它?任何的想法?这是一个好方法吗?

3 个答案:

答案 0 :(得分:2)

我建议查看god。它专为此类任务而设计,可以很容易地为后台和守护程序应用程序构建监控系统。

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

做同样事情的老派方法是使用cron定期开始工作。该作业可以是您的脚本,通过将文件列表与缓存版本进行比较来检查文件列表是否已更改,然后在出现异常情况时根据需要执行操作。

答案 1 :(得分:0)

只需在后台运行

即可运行脚本
ruby myRBNotifier.rb &

当您需要停止它时,找到进程ID并在其上使用kill:

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

这会回答你的问题吗?

答案 2 :(得分:0)

如果您在mac / unix计算机上运行,​​请查看launchctl man page。您可以设置一个进程,以便在文件发生更改时运行并执行ruby脚本。它具有高度可配置性。