web-dev-qa-db-fra.com

Comment exécuter un script lorsqu'un répertoire est modifié par un autre utilisateur?

Je sais qu'il a été un peu de discussion sur des sujets similaires à celui-ci. Mais voici ce que j'essaie fondamentalement de faire.

J'ai un répertoire surveillé appelé watched et chaque fois qu'un fichier est ajouté à ce répertoire, je souhaite déclencher un script appelé syncbh.sh qui extraira les fichiers de ce répertoire et les téléchargera sur un serveur distant.

La mise en garde est que les fichiers sont créés dans le répertoire watched par un utilisateur (utilisateur2), mais que le script est exécuté par un autre (utilisateur1).

J'ai essayé d'utiliser incron pour accomplir cela, mais je continue à rencontrer un problème majeur car, alors que le script peut être exécuté manuellement par l'utilisateur 1 avec les privilèges root, le démon incron n'est jamais effectivement déclenchée automatiquement par un événement de création de fichier par l'autre utilisateur2.

J'ai réfléchi à la question de savoir si inoticoming serait une meilleure alternative, mais je ne suis pas sûr de la syntaxe de cette syntaxe. S'il existe un meilleur moyen d'accomplir cela, ou si je finis par utiliser inoticoming, quelle serait la syntaxe de la commande pour lui demander de regarder le répertoire /home/user1/watched et d'exécuter le script /usr/local/bin/syncbh.sh if un fichier est créé/modifié dans ce répertoire?

Toute aide serait très appréciée.

13
user280327

Utiliser inoticoming:

Vous pouvez mettre un script dans /etc/init.d/ qui exécute inoticoming au moment du démarrage.

  1. Créez un nouveau dossier pour contenir le inoticoming log/last pid du dossier watched: Sudo mkdir -p /var/log/inoticoming/watched/

  2. Créez un script inoticoming_watched dans /etc/init.d/:

* N'oubliez pas de modifier <path_to_folder> et <path_to_script> pour qu'ils correspondent au chemin complet du dossier watched et au chemin complet du script à exécuter.

#!/bin/sh

case "${1}" in
    start)
        inoticoming --logfile '/var/log/inoticoming/watched/inoticoming.log' --pid-file '/var/log/inoticoming/watched/inoticoming_last_pid.txt' <path_to_folder> <path_to_script> \;
    ;;

    stop)
        kill -15 $(< /var/log/inoticoming/watched/inoticoming_last_pid.txt tee)
    ;;

    restart)
        ${0} stop
        sleep 1
        ${0} start
    ;;

    *)
    echo "Usage: ${0} {start|stop|restart}"
    exit 1
    ;;
esac
  1. Marquez le script comme exécutable: Sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Assurez-vous que le script appelé par inoticoming_watched est exécutable.

  3. Mettez à jour rc.d pour que le service inoticoming_watched démarre au démarrage: Sudo update-rc.d inoticoming_watched defaults

Vous pouvez vérifier le journal inoticoming dans /var/log/inoticoming/watched.

5
kos

Tout d’abord, installez inoticoming:

Sudo apt-get install inoticoming

Ensuite, utilisez cette commande:

Faites attention aux processus en cours d'inoticoming, car ils peuvent être démarrés plusieurs fois.

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • Le processus s'exécute en arrière-plan et surveille /home/user1/watched

  • Lorsqu'un fichier est ajouté ou modifié dans ce répertoire, le script /usr/local/bin/syncbh.sh est appelé.

    • Le paramètre pour ce script est dans ce cas /home/user1/watched/<name_of_changed_or_modified_file>

    • {} est remplacé par le nom du fichier

4
A.B.