IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Arrêt d'un script avec inotifywait


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Arrêt d'un script avec inotifywait
    Bonjour à tous,

    Avant de commencer, je préfère vous prévenir que c'est mon premier script bash, donc n'hésitez pas à me dire si vous voyez quelque chose qui est totalement à côté de la plaque...

    Voici ma problématique: je souhaite monitorer un dossier et faire une action dès qu'un fichier d'un certain nom y est déposé.

    J'ai cherché un peu et j'ai découvert l'outil inotifywait qui a l'air absolument génial. J'ai ensuite construit ce script, qui m'a l'air de très bien fonctionner, d'après les tests que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #!/bin/bash
    # Repertoire a surveiller (si fichier mettre repertoire parent)
    WATCHDIR="/root/watch"
    DATETIME="`date +%Y-%m-%d` `date +%T%z`" # Ajout de la date
    DATE_FOR_FILENAME=`date +%Y%m%d`
    SCRIPT_LOG_DIR="/root/isitec/log/"
    SCRIPT_LOGFILE="${SCRIPT_LOG_DIR}isitec-${DATE_FOR_FILENAME}.log"
    {
        sleep 5m
        kill $$
    } &
    while true
    do
    {
    	inotifywait -m -r -e create "$WATCHDIR" --format "%f" | while read f >> "${SCRIPT_LOGFILE}"
     
    	do
        	echo $f
        	# on verifie que le fichier commence par ZZZ
        	if [[ $f = ZZZ.* ]]; then
    	 	 sleep 30
    	  	ls -rtlh $WATCHDIR/ZZZ.* >> "${SCRIPT_LOGFILE}"
    	  	mv -v "$WATCHDIR/$f" "$WATCHDIR/ok$f" >> "${SCRIPT_LOGFILE}"
        	fi
    	done
    }
    done
    Vous aurez probablement remarqué le kill. En fait, j'aimerais que ce script se termine au bout d'un certain temps. Mon but est de le lancer tous les jours, le matin en le mettant dans crontab, et faire en sorte qu'au bout d'un certain temps, il se termine tout seul (pour éviter les fuites de mémoire ou autres désagrément - je ne sais pas si c'est utile, mais j'aimerais quand même mettre ceci en place). J'ai trouvé la fonction timeout que j'ai utilisé dans la ligne de crontab, qui fonctionnait très bien avec mon environnement de test qui est sous OL7, mais pas sur mon environnement de prod sous OL6.

    C'est donc pour cela que j'ai mis cette fonction kill, mais rien n'y fait, mon script continue de fonctionner, même après les 5 minutes.

    Je m'en remet donc à vous. Auriez-vous une méthode pour faire en sorte que cela fonctionne ? J'ai essayé plusieurs choses, en vain...

    Merci d'avance pour votre aide

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Bonjour

    Sans partir dans des dissertations sur la liberté, il me semble qu'imposer un arrêt de l'extérieur est une violence faite à ton script, que ce soit par timeout ou kill. Il serait plus élégant de faire mourir ton script naturellement, de l'intérieur.

    De ce que je vois, ta boucle et ton inotifywait ont la même fonction : attendre. ( Redondance ? ). Dans les commandes d'attente, il y a toujours une option d'échéance.
    • Pour inotifywait, c'est -t ou --timeout
    • Pour la commande while, c'est à toi de la coder à partir de la commande "date", sûrement.


    D'autre part,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read f >> "${SCRIPT_LOGFILE}"
    read ne renvoie rien. Donc ton fichier de traces sera toujours vide. Étrange commande.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci beaucoup pour ton retour, j'ai fait quelques modifs et ça semble fonctionner !

    Voici mon nouveau code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #!/bin/bash
    # Repertoire a surveiller (si fichier mettre repertoire parent)
    WATCHDIR="/root/watch"
    DATETIME="`date +%Y-%m-%d` `date +%T%z`" # Ajout de la date
    DATE_FOR_FILENAME=`date +%Y%m%d`
    SCRIPT_LOG_DIR="/root/tecit/log/"
    SCRIPT_LOGFILE="${SCRIPT_LOG_DIR}tecit-${DATE_FOR_FILENAME}.log"
    end=$((SECONDS+120))
    {
        sleep 2m
        kill $$
    } &
    while [ $SECONDS -lt $end ]; do
    {
    	timeout -s SIGINT 2m inotifywait -m -r -e create "$WATCHDIR" --format "%f" | while read f
     
    	do
        	echo $f
        	# on verifie que le fichier commence par ZZZ
        	if [[ $f = ZZZ.* ]]; then
    	 	sleep 30
    	   	ls -rtlh $WATCHDIR/ZZZ.* >> "${SCRIPT_LOGFILE}"
    	   	mv -v "$WATCHDIR/$f" "$WATCHDIR/ok$f" >> "${SCRIPT_LOGFILE}"
        	fi
    	done
    }
    done
    Merci beaucoup pour ton aide !

Discussions similaires

  1. scripts avec XP
    Par Zetophe dans le forum Windows
    Réponses: 3
    Dernier message: 23/02/2006, 13h07
  2. Execution script avec option sur OVH
    Par guepe dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 15/01/2006, 15h54
  3. exemple de script avec autoloader
    Par djibril dans le forum Modules
    Réponses: 4
    Dernier message: 24/11/2005, 17h53
  4. Réponses: 4
    Dernier message: 02/11/2004, 15h18
  5. Script avec JOINTURE et CASE
    Par Labienus dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/02/2004, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo