субота, 8 серпня 2009 р.

Ruby for System Administration → Ruby-inotify

Inotify - це підсистема ядра Linux, яка дозволяє отримувати повідомлення про зміни у файловій системі. У основне ядро була включена починаючи з 2.6.13. Основна сфера використання - в системах пошуку (наприклад Beagle), таким чином програмі-індексатору не потрібно сканувати всю файлову систему кожні кілька хвилин.

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-сторінку.

Посилання:

Немає коментарів: