Ruby has become quite popular these days for writing maintenance & monitoring scripts, and a feature many of these kinds of scripts require is tracking files & directories for changes. Ruby has a few gems which let you accomplish this task easily, the one we are going to discuss about is rb-inotify. rb-inotify is a simple wrapper written using FFI around the inotify system calls, which is boon for people using shared servers or accounts with restricted access as there is no C/C++ extension to be compiled, so very easy to install. Those who have used the C API will feel very comfortable with it. Installing rb-notify gem Issue the following command from a shell: Code: $ gem install rb-inotify Using rb-notify to track changes to files & directories rb-inotify uses the inotify system library, so essentially rb-notify can track all attributes that it supports, here's a list of masks & their being description: Code: access File was accessed (read) attrib Metadata changed (permissions, timestamps, extended attributes, etc.) close_write File opened for writing was closed close_nowrite File not opened for writing was closed create File/directory created in watched directory delete File/directory deleted from watched directory delete_self Watched file/directory was itself deleted modify File was modified move_self Watched file/directory was itself moved moved_from File moved out of watched directory moved_to File moved into watched directory open File was opened Now, let's get our hands dirty with some code: Code: #!/usr/bin/ruby require 'rubygems' require 'rb-inotify' notifier = INotify::Notifier.new notifier.watch("/tmp/pradeep", :create, :delete, :attrib) do |event| event.flags.each do |flag| ## convert to string flag = flag.to_s puts case flag when 'create' then "#{event.name} created in /tmp/pradeep" when 'delete' then "#{event.name} deleted in /tmp/pradeep" when 'attrib' then "#{event.name}'s attributes changed in /tmp/pradeep" end end end ## loop, wait for events from inotify notifier.run Output: Code: [pradeep@glentauchers]$ ruby aa.rb & [1] 20060 [pradeep@glentauchers]$ [pradeep@glentauchers]$ echo '1' > /tmp/pradeep/pop.op01 [pradeep@glentauchers]$ pop.op01 created in /tmp/pradeep [pradeep@glentauchers]$ rm !$ rm /tmp/pradeep/pop.op01 pop.op01 deleted in /tmp/pradeep [pradeep@glentauchers]$ chmod +x /tmp/pradeep/pop.op00 pop.op00's attributes changed in /tmp/pradeep [pradeep@glentauchers]$ It's as simple as that, try it out and you may find it a lot useful when required.