Запускайте процесс каждый раз, когда в каталоге создается новый файл в Linux.

Я разрабатываю приложение. Я использую операционную систему Linux. Мне нужно запустить, если возможно, скрипт ruby ​​для файла, созданного в каталоге. Мне нужно, чтобы этот скрипт всегда работал. Первое, о чем я подумал, это inotify:

API-интерфейс inotify предоставляет механизм мониторинга событий файловой системы. Inotify можно использовать для мониторинга отдельных файлов или каталогов.

Это именно то, что мне нужно, тогда я нашел "rb-inotify", обертку для 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, и это будет зацикливаться навсегда. Как мне это остановить? Любая идея? Хороший ли это подход?


person Andres    schedule 29.11.2012    source источник
comment
Как мне это остановить? ctrl-c   -  person froderik    schedule 30.11.2012
comment
It's exactly what I need - I need to keep this script running always... - How do I stop it? Не знаете, в чем проблема?   -  person AJcodez    schedule 30.11.2012


Ответы (3)


Я бы рекомендовал взглянуть на god. Он предназначен для такого рода задач и позволяет довольно легко создать систему мониторинга для фоновых приложений и приложений-демонов.

Что касается самого основного кода, то inotify не является кросс-платформенным, поэтому, если у вас есть возможность работать в Windows или Mac OS, вам понадобится другое решение. Не так уж сложно написать небольшой фрагмент кода, который периодически проверяет ваш целевой каталог на наличие изменений. Если вам нужно знать, что изменилось, прочитайте и кэшируйте записи каталога, а затем сравните их при следующем запуске кода. Используйте sleep между запусками, чтобы подождать некоторое время перед циклом.

Старый метод выполнения подобных действий заключается в использовании cron для запуска задания через равные промежутки времени. Это задание может быть вашим сценарием, который проверяет, изменился ли список файлов, сравнивая его с кешированной версией, а затем действуя по мере необходимости, если что-то отличается.

person the Tin Man    schedule 30.11.2012

Просто запустите свой скрипт в фоновом режиме с помощью

ruby myRBNotifier.rb &

Когда вам нужно остановить его, найдите идентификатор процесса и используйте для него команду kill:

ps ux
kill [whatever pid your process gets from the OS]

Это отвечает на ваш вопрос?

person jboursiquot    schedule 29.11.2012
comment
Запуск в фоновом режиме работает только при подключении сеанса. Если пользователь выйдет из системы или его сеанс завершится, приложение будет уничтожено. screen можно использовать для отсоединения и повторного присоединения, но это усложняет решение. - person the Tin Man; 30.11.2012

Если вы работаете на компьютере Mac/Unix, просмотрите launchctl справочная страница. Вы можете настроить процесс для запуска и выполнения скрипта ruby ​​при каждом изменении файла. Это легко настраивается.

person Alfie Hanssen    schedule 31.07.2013