#linux #bash
Вопрос:
У меня есть два датчика, каждый из которых при срабатывании создает запись в текстовом файле. Теперь мне нужно что-то для мониторинга этих двух файлов (я также могу поместить их в 2 каталога каждый, если это каким-либо образом поможет) и запускать третий сценарий только тогда, когда происходят изменения в обоих вышеупомянутых файлах/каталогах. Мне нужно реальное время (или близкое к нему) между событиями и уведомлением. Я нашел такие инструменты, как inotify-wait, fswatch, entr и некоторые другие, но все они срабатывают при любом изменении.
На данный момент я пытаюсь это сделать, но это не работает должным образом:
#!/bin/bash
while inotifywait -e modify /home/user/triggerdir/ ;
do
if [ "inotifywait -e modify /home/user/triggerdir2/" ];
then
echo Alert | mail -n -s "test-notify SCRIPT HUZAAAA" user@gmail.com
else
# Don't do anything unless we've found one of those
:
fi
done
Я искал подобные проблемы/решения в Интернете, самым близким было бы это, но у него нет рабочего ответа.
Ответ №1:
Поскольку у вас возникли проблемы с этим, вы можете рассмотреть упрощенный подход.
Вместо цикла я бы поместил ваш сценарий в crontab
. Запускайте его каждый день, каждый час, каждую минуту, все, что вам нужно. Если вам нужно чаще, вы можете делать циклы, но убедитесь, что вы спите хотя бы секунду, чтобы быть внимательным к процессору.
Если минута или более между событием и уведомлением в порядке, это должно быть все, что вам нужно:
#!/bin/bash
key=/some/safe/path/.hidden_filename
[[ -e "$key" ]] || touch "$key" # make sure it exists
if [[ file1 -nt "$key" amp;amp; file2 -nt "$key" ]]; then
mail -n -s "test-notify SCRIPT HUZAAAA" user@gmail.com <<< "Alert!"
touch "$key"
fi
Ответ №2:
Я взломал что-то вместе, что работает так, как мне нужно, хотя это ужасное кодирование (вероятно, его не следует так называть) задействовано 3 сценария: сценарий 1:
#!/bin/bash
count=0
while :
do
{ inotifywait -e modify /home/user/triggerdir/ amp;amp; let count="$count 1"; } || exit 1
if [ "$count" -eq "2" ]; then
echo Alert | mail -n -s "Huzzah" user@gmail.com
/home/user/trigger2.sh amp;amp;
killall trigger.sh inotifywait
fi
done
сценарий 2:
#!/bin/bash
count=0
while :
do
{ inotifywait -e modify /home/user/triggerdir/ amp;amp; let count="$count 1"; } || exit 1
if [ "$count" -eq "2" ]; then
echo Alert | mail -n -s "Huzzah" user@gmail.com
/home/user/trigger.sh amp;amp;
killall trigger2.sh #Do something.
# count=-250
fi
done
поскольку два сценария порождают процессы bash/inotify, которые я запускаю один раз в 24 часа, два друга убивают тех, кто использует этот сценарий 3:
#!/bin/bash
killall trigger2.sh trigger.sh inotifywait bash
любая помощь в улучшении приветствуется, спасибо 🙂