ruby-inotify - це Ruby інтерфейс для доступу до системних викликів Linux Inotify.
Дозволяє виявляти, якщо файл був відкритий, закритий, переміщений, видалений, модифікований і багато чого іншого.
Доступні події:
ACCESS - звернення до файлу(читання).
MODIFY - файл був змінений(запис).
CREATE - файл був створений.
ATTRIB - змінені метадані (права, дата створення/редагування, розширені атрибути, і т.д.).
CLOSE_WRITE - файл, відкритий для запису, був закритий.
CLOSE_NOWRITE - файл, не відкритий для запису, був закритий.
OPEN - файл був відкритий.
MOVED_FROM - файл був переміщений від слідкування.
MOVED_TO - файл був переміщений до слідкування.
DELETE - файл був видалений.
DELETE_SELF - відслідковуваний файл/каталог був видалений.
CLOSE - IN_CLOSE_WRITE | IN_CLOSE_NOWRITE
MOVE - IN_MOVED_FROM | IN_MOVED_TO
ALL_EVENTS - будь-яка з подій.
UNMOUNT - файлова система була відмонтована.
Q_OVERFLOW - черава inotify переповнена.
IGNORED - відслідковуваний файл був автоматично видалений, тому що файл був видалений або файлова система розмонтована.
ISDIR - подій відбулася відносто каталогу.
Процес інсталяції з вихідних кодів є дуже простим:
$ wget http://dinhe.net/~aredridel/projects/ruby/ruby-inotify-0.0.2.tar.gz
$ tar xzvf ruby-inotify-0.0.2.tar.gz
$ cd ruby-inotify-0.0.2/
$ rake1.9.1
$ sudo make install
Як воно працює?
У каталозі examples міститься скрипт watcher.rb, який є простим прикладом роботи з ruby-inotify.
#!usr/bin/ruby
require 'inotify'
require 'find'
i = Inotify.new
t = Thread.new do
i.each_event do |ev|
p ev.name
p ev.mask
end
end
raise("Specify a directory") if !ARGV[0]
Find.find(ARGV[0]) do |e|
if ['.svn', 'CVS', 'RCS'].include? File.basename(e) or !File.directory? e
Find.prune
else
begin
puts "Adding #{e}"
i.add_watch(e, Inotify::CREATE | Inotify::DELETE | Inotify::MOVE)
rescue
puts "Skipping #{e}: #{$!}"
end
end
end
t.join
При створенні/видаленні/переміщені будь-якого файлу чи каталогу на екран буде виведене його ім’я і маска.
Як бачите все доволі просто.
Запустимо скрипт:
$ ruby1.9.1 watcher.rb .
Створимо файл з іменем test.txt і подивимось на результат роботи скрипта
результат:
"test.txt"
256
Створимо каталог з іменем test
результат:
"test"
1073742080
Видалимо файл test.txt
результат:
"test.txt"
512
Видалимо каталог test
результат:
"test"
1073742336
Де застосовувати?
Та де завгодно! Наприклад на мому домашньому сервері крутиться скрипт, який слідкує за каталогом /mnt/smb/downloads (у який користувачі через ssh скачують файли з інтернету) і виводить час створення або видалення файлів на web-сторінку.
Посилання:
Немає коментарів:
Дописати коментар