web-dev-qa-db-fra.com

Comment utiliser inotifywait de manière non bloquante et envoyer les résultats?

J'ai essayé plusieurs fois de tester mon script, mais sans succès. Voici le script:

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/* [email protected]:/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" [email protected] < ~/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

J'ai essayé de courir avec la commande sleep avec "pipe" après sed et de changer l'ordre des commandes. Lors de l'exécution du script dans leur terminal le problème est que inotify attend toujours une action ...

Je dois garantir que les fichiers sont copiés, déplacés et que le $filename est envoyé par e-mail ...

De l'aide?
Merci!

1
DJames

Si vous souhaitez envoyer un e-mail chaque fois qu'un fichier a été déplacé du répertoire surveillé, vous devrez configurer un processus différent en surveillant ce et l'envoi du courrier.

Pour les raisons que vous venez de décrire, peu importe où vous placez la commande inotifywait, car la commande mv ne fonctionne pas se produit en même temps , vous n'attraperez pas l'événement requis.

Mais si vous avez regardé le répertoire d'un autre processus, le déplacement a lieu pendant que vous regardez et vous pouvez détecter les modifications.

En s'appuyant sur exemple précédent , vous pouvez commencer avec l'exemple de script suivant.

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" [email protected] < ~/Documents/personaproject/Programa/scripts/mail.txt
done

Veuillez remplir les détails requis, cela fonctionne essentiellement de la même manière que l'exemple précédent.

Remarque:
Il y a quelques mises en garde, par exemple, il peut manquer certains mouvements pendant l'envoi du courrier. Cela dépend de la quantité et de la fréquence des déplacements.

1
lgarzo

voici comment c'est fait maintenant (script initial):

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/* [email protected]:/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

puis mon nouveau script "mail.sh" pour surveiller le dossier et envoyer l'e-mail séparément:

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" [email protected] < ~/Documents/personaproject/Programa/scripts/mail.txt
done

Comme vous l'avez dit, il y a quelques mises en garde, s'il y a plus d'un fichier, un seul e-mail est envoyé avec le premier dossier sur le sujet. C'est une amélioration à apporter. Bien qu'il s'agisse d'un script à exécuter par l'utilisateur, environ une fois par semaine et probablement avec un seul dossier.

merci!

1
DJames