Я только что установил inotify-tools. Я хотел бы постоянно обнаруживать новые файлы с помощью notify-tools в нескольких каталогах и отправлять электронную почту с использованием postfix. Я, вероятно, могу обработать отправку электронной почты, используя постфиксную часть. Я просто пытаюсь выяснить лучший способ сделать это при обнаружении нового файла (ов). Потому что иногда несколько файлов добавляются одновременно.
4 ответа
inotifywait (часть inotify-tools) - это правильный инструмент для достижения вашей цели, не имеет значения, что несколько файлов создаются одновременно, он обнаружит их.
Вот пример скрипта:
#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done
inotifywait будет использовать эти опции.
-m, чтобы следить за каталогом бесконечно, если вы не используете эту опцию, как только он обнаружит новый файл, сценарий завершится.
-r будет рекурсивно следить за файлами (если существует много папок / файлов, обнаружение новых созданных файлов может занять некоторое время)
-e создать это возможность указать событие для мониторинга и в вашем случае следует создать , чтобы заботиться о новых файлах
--format "% w% f" распечатает файл в формате /complete/path/file.name
«$ {MONITORDIR}» - это переменная, содержащая путь к монитору, который мы определили ранее.
Таким образом, в случае создания нового файла, inotifywait обнаружит его и напечатает вывод (/complete/path/file.name) в канал и пока назначит этот вывод переменной NEWFILE.
Внутри цикла while вы увидите способ отправки почты на ваш адрес с помощью утилиты mailx, которая должна нормально работать с вашим локальным MTA (в вашем случае, Postfix).
Если вы хотите отслеживать несколько каталогов, inotifywait не позволяет этого, но у вас есть два варианта: создать сценарий для каждого каталога для мониторинга или создать функцию внутри сценария, что-то вроде этого:
#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"
monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &
Используйте inotifywait, например:
inotifywait -m /path -e create -e moved_to |
while read path action file; do
echo "The file '$file' appeared in directory '$path' via '$action'"
# do something with the file
done
Для получения дополнительной информации и примеров см. Статью
Как использовать inotify-tools для запуска сценариев событий в файловой системе.
Для нескольких каталогов вы можете сделать это:
#!/bin/bash
monitor() {
inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
do
echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done
}
monitor &
Вот пример списка папок в файле /etc/default/inotifywait
/etc/default/inotifywait
/home/user1
/path/to/folder2/
/some/path/
Нет возврата для меня.
Linux thinkcentre2 4.13.0-16-generic # 19-Ubuntu SMP Ср. 11 октября 18:35:14 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
inotifywait 3.14