сценарий, который будет отслеживать изменения по крайней мере в 2 файлах/каталогах и выполнять третий сценарий только при изменении обоих

#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
 

любая помощь в улучшении приветствуется, спасибо 🙂