Как использовать 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" &
запустить в качестве фоновой команды, не блокируя