Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在linux中,每次在目录中创建新文件时运行一个进程_Ruby_Linux_Inotify - Fatal编程技术网

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

Ruby 在linux中,每次在目录中创建新文件时运行一个进程,ruby,linux,inotify,Ruby,Linux,Inotify,我正在开发一个应用程序。我使用的操作系统是linux。如果可能的话,我需要在目录中创建的文件上运行ruby脚本。我需要让这个脚本一直运行。我首先想到的是inotify: inotifyapi提供了一种监控文件系统事件的机制。Inotify可用于监视单个文件或目录 这正是我所需要的,然后我找到了“rb inotify”,一种包装fir inotify 你认为有比使用inotify更好的方法来做我需要的事情吗?另外,我真的不明白我必须如何使用rb inotify 例如,我只是创建了一个rb文件,其中

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

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

这正是我所需要的,然后我找到了“rb inotify”,一种包装fir 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
,它将永远保持循环。我该怎么阻止它?有什么想法吗?这是一种好方法吗?

只需在后台使用

ruby myRBNotifier.rb &
需要停止时,请找到进程id并对其使用kill:

ps ux
kill [whatever pid your process gets from the OS]
这回答了你的问题吗?

我建议你看看。它是为这类任务而设计的,并且使得为后台和守护程序应用程序构建监控系统变得非常容易

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


做类似事情的老派方法是使用cron定期启动作业。该作业可以是您的脚本,通过将文件列表与缓存版本进行比较来检查文件列表是否已更改,然后根据需要在不同的情况下执行操作。

如果您在mac/unix计算机上运行,请查看
启动ctl
。您可以设置一个进程,以便在文件更改时运行和执行ruby脚本。它是高度可配置的

我该怎么阻止它?ctrl-c
这正是我需要的
-
我需要始终运行此脚本…
-
如何停止它?
不确定问题出在哪里?仅在连接会话时在后台运行它。如果用户注销或会话终止,应用程序将被终止<代码>屏幕可用于允许分离和重新连接,但这会使解决方案复杂化。