Как использовать inotifywait неблокирующим способом и отправить результаты по почте?

Я несколько раз пытался протестировать мой сценарий, но безуспешно. Это скрипт:

zenity --question --text "my text"
if [ $? -eq 1 ]; then
    zenity --warning --text "my text"
else
    ping -n -c1 192.168.180.112
    # print result (0 se existir)
    echo $?
    if [ $? -eq 0 ]; then
        scp -r ~/Documents/Processo/CONCLUIDO/* posto-ensaios@192.168.180.112:/home/posto-ensaios/Documents/Processo
        fileName=$(inotifywait -e moved_from /home/posto-11v/Documents/Processo/CONCLUIDO | sed -r 's/^.*MOVED_FROM(,ISDIR)*\s+(.*)$/\2/g')
        mail -s "$fileName" USER@MAIL.HOST < ~/Documents/personaproject/Programa/scripts/mail.txt
        mv --backup ~/Documents/Processo/CONCLUIDO/* ~/Documents/personaproject/processos_terminados    
        zenity --info --text="my text"
    else
        zenity --warning --text "my text"
    fi
fi

Я пытался бежать с sleep команда с "трубой" после sed и изменить порядок команд. При запуске скрипта в их терминале проблема в том, что inotify всегда ждет действия...

Я должен гарантировать, что файлы копируются, перемещаются и $filename отправлено по электронной почте...

Любая помощь?
Спасибо!

3 ответа

Решение

Если вы хотите отправлять почту каждый раз, когда файл перемещается из просматриваемого каталога, вам нужно настроить другой процесс, отслеживающий это и отправляющий почту.

По причинам, которые вы только что описали, не имеет значения, куда вы положили inotifywait команда, так как mv Команда не происходит одновременно, вы не поймаете нужное событие.

Но если вы просматривали каталог из другого процесса, перемещение происходит во время просмотра, и вы можете обнаружить любые изменения.

Основываясь на предыдущем примере, вы можете начать со следующего примера сценария.

while true
do
    fileName=$(inotifywait -e moved_from /home/posto-11v/Documents/Processo/CONCLUIDO | sed -r 's/^.*MOVED_FROM(,ISDIR)*\s+(.*)$/\2/g')
    mail -s "$fileName" USER@MAIL.HOST < ~/Documents/personaproject/Programa/scripts/mail.txt
done

Пожалуйста, заполните необходимые данные, они работают в основном так же, как и в предыдущем примере.

Замечания:
Есть несколько предостережений, например, он может пропустить некоторые шаги во время отправки почты. Это зависит от количества и частоты ходов.

Вот как это делается сейчас (начальный сценарий):

zenity --question --text "my text"
if [ $? -eq 1 ]; then
    zenity --warning --text "my text"
else
    ping -n -c1 192.168.180.112
echo $?
if [ $? -eq 0 ]; then
    scp -r ~/Documents/Processo/CONCLUIDO/* posto-ensaios@192.168.180.112:/home/posto-ensaios/Documents/Processo
    nohup ~/Documents/personaproject/Programa/scripts/mail.sh &
    sleep 1
    mv --backup ~/Documents/Processo/CONCLUIDO/* ~/Documents/personaproject/processos_terminados    
    zenity --info --text="my text"
else
    zenity --warning --text "my text"
fi
fi

затем мой новый скрипт "mail.sh" для мониторинга папки и отправки электронного письма в отдельности:

while true
do
    fileName=$(inotifywait -e moved_from /home/posto-11v/Documents/Processo/CONCLUIDO | sed -r 's/^.*MOVED_FROM(,ISDIR)*\s+(.*)$/\2/g')
    mail -s "$fileName" user@mail.host < ~/Documents/personaproject/Programa/scripts/mail.txt
done

Как вы сказали, есть некоторые предостережения, если существует более одного файла, отправляется только одно электронное письмо с первой папкой по теме. Это улучшение должно быть сделано. Хотя это скрипт, который должен выполняться пользователем, примерно раз в неделю и, вероятно, только с одной папкой.

Thks!

zenity --warning --text "my text" &

запустить в качестве фоновой команды, не блокируя

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