Обработка данных с помощью inotify-tools в качестве демона

У меня есть скрипт bash, который обрабатывает некоторые данные с помощью inotify-tools, чтобы узнать, когда в файловой системе произошли определенные события. Он работает нормально, если запускается в консоли bash, но когда я пытаюсь запустить его как демон, он выходит из строя. Я думаю, что причина в том, что все выходные данные inotifywait вызов команды переходит в файл, таким образом, часть после | while больше не звонят. Как я могу это исправить? Вот мой сценарий.

#!/bin/bash

inotifywait -d -r \
-o /dev/null \
-e close_write \
--exclude "^[\.+]|cgi-bin|recycle_bin" \
--format "%w:%&e:%f" \
$1|
while IFS=':' read directory event file
do

    #doing my thing

done

Так, -d говорит inotifywait бежать как демон, -r сделать это рекурсивно и -o это файл, в котором сохраняются выходные данные В моем случае файл /dev/null потому что мне не нужен вывод, кроме обработки части после команды (| while...)

3 ответа

Решение

Ты не хочешь бежать inotify-wait как демон в этом случае, потому что вы хотите продолжить вывод процесса из команды. Вы хотите заменить -d опция командной строки с -m, который говорит inotifywait продолжать отслеживать файлы и продолжить печать в stdout:

   -m, --monitor
          Instead  of exiting after receiving a single event, execute
          indefinitely.  The default behaviour is to exit  after  the
          first event occurs.

Если вы хотите, чтобы все работало в фоновом режиме, вам нужно создать фон для всего сценария.

Вот решение с использованием nohup: (Обратите внимание, в моем тестировании, если я указал -o, цикл while, похоже, не оценивался)

nohup inotifywait -m -r \
  -e close_write \
  --exclude "^[\.+]|cgi-bin|recycle_bin" \
  --format "%w:%&e:%f" \
  $1 |
while IFS=':' read directory event file
do
  #doing my thing
done >> /some/path/to/log 2>&1 &

Меня тоже смутил режим демона и варианты его использования. Затем я обнаружил, что против него открыта старая проблема: попытка демонизировать inotifywait

В комментарии сказано

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

Поэтому я предполагаю, что если требуется немедленное действие, я должен запустить -m и выполнить весь скрипт в фоновом режиме, как сказал @larsks

Другие вопросы по тегам