Обработка данных с помощью 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