I have a Ruby script that needs to run about one time a second. I am using a Ruby script to keep track of modifications of files in a directory and want the script to track updates in "live" time.
Basically, I want my script to do the same kind of thing as running "top" on a Unix shell, where the screen is updated every second or so. Is there an equivalent to setInterval
in Ruby like there is in JavaScript?
Or you could use TimerTask from the Concurrent Ruby gem
Code extracted from the same link
You might want to consider using something like rb-inotify to get notifications of changes of files. This way you can avoid "sleep" and keep the "live" feeling.
There is some useful information at the "Efficient Filesystem Handling" section of the Guard Gem documentation: https://github.com/guard/guard#efficient-filesystem-handling
You may find interesting this gem whenever
You can code repeating tasks this way:
As stated in another answer, rb-inotify is well suited to this sort of thing. If you don't want to use it, then a simple approach is to use threads:
To stop polling, use
a.kill
or make sure that some_method kills its own thread withThread.kill
when some condition is met.Using two threads like this ensures that some_method runs at least every second, regardless of the length of the operation, without having to do any time checking yourself (within the granularity of the thread scheduling, of course).
There are a few ways to do this.
The quick-and-dirty versions:
shell (kornish):
watch(1):
This will run your script every second and keep the output of the most recent run displayed in your terminal.
in ruby:
These all suffer from the same issue: if the actual script/function takes time to run, it makes the loop run less than every second.
Here is a ruby function that will make sure the function is called (almost) exactly every second, as long as the function doesn't take longer than a second:
Use it like this: