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

Linux Discussion :

Intercepter les erreurs d'une commande ?


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut Intercepter les erreurs d'une commande ?
    Bonjour les amis

    J'ai développé un petit script qui me permet de mettre à jour l'arbre des ports sous FreeBSD. Via la commande trap, j'intercepte les diffèrents signaux provoqués par les applications exécutées par mon script via la fonction "go". Cependant, je n'arrive pas à récupérer le nom du programme qui a planté.

    Voici mon script :
    #!/usr/local/bin/zsh

    # -------------------
    # Global settings.
    # -------------------

    rep=/usr/ports
    yplog=/root/yplog.log
    nplog=/root/nplog.log

    # --------------------
    # Functions.
    # --------------------

    go () {
    /usr/local/bin/cvsup -g -L 2 /root/cvsup/ports-supfile
    cd /usr/ports && make fetchindex
    cd /usr/ports && make index
    /usr/local/sbin/portsdb -Uu
    }

    nostop () {
    echo `date '+%a %b %d %T'` "ports: failed /usr/ports doesnt seem to exist" >> $nplog
    }

    ohyes () {
    echo `date '+%a %b %d %T'` "ports: the port tree is up-to-date" >> $yplog
    }

    # --------------------
    # Signals.
    # --------------------

    trap 'echo "signal [1]: Hangup" >> $nplog ; exit 1' 1
    trap 'echo "signal [2]: Interrupt" >> $nplog ; exit 2' 2
    trap 'echo "signal [3]: Quit" >> $nplog ; exit 3' 3
    trap 'echo "signal [6]: Abort" >> $nplog ; exit 6' 6
    trap 'echo "signal [9]: Killed" >> $nplog ; exit 9' 9
    trap 'echo "signal [15]: Dying On signal" >> $nplog ; exit 15' 15

    # --------------------
    # Program.
    # --------------------

    if [ -d $rep ]; then
    go
    ohyes
    else
    nostop
    fi

    # End of file
    J'ai essayé avec un :
    trap 'echo "error occured:" awk "NR==$LINENO" $0 >> $nplog' ZERR
    mais sans succès.

    Avez-vous des idées à me soumettre ?

    Merci

  2. #2
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Je remercie Julp de m'avoir consacré de son temps car il a trouvé la solution au problème. Voici le code qu'il fallait trouver:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    trap 'echo -n "error occured with signal [1]: Hangup from: " >> $nplog ; \
    	awk "NR==$LINENO" $0 | sed "s/^[ \t]*//" >> $nplog ; exit 1' 1
    Les jeux sont faits. Le grand gagnant se verra remettre une bouteille de jus de fruit

    Merci

  3. #3
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    je viens d'apporter des modifications à ce script que voici:
    #!/bin/sh

    # -------------------
    # Global settings.
    # -------------------

    rep=/usr/ports
    yplog=/var/log/yplog.log
    nplog=/var/log/nplog.log

    # --------------------
    # Functions.
    # --------------------

    nostop () {
    echo `date '+%a %b %d %T'` "ports: failed /usr/ports doesnt seem to exist" >> $nplog
    }

    ohyes () {
    echo `date '+%a %b %d %T'` "ports: the port tree is up-to-date" >> $yplog
    }

    # --------------------
    # Signals.
    # --------------------

    trap 'echo -n "error occured with signal [1]: Hangup from: " >> $nplog ; \
    awk "NR==$LINENO" $0 | sed "s/^[ \t]*//" >> $nplog ; exit 1' 1

    trap 'echo -n "error occured with signal [2]: Interrupt from: " >> $nplog ; \
    awk "NR==$LINENO" $0 | sed "s/^[ \t]*//" >> $nplog ; exit 2' 2

    trap 'echo -n "error occured with signal [3]: Quit from: " >> $nplog ; \
    awk "NR==$LINENO" $0 | sed "s/^[ \t]*//" >> $nplog ; exit 3' 3

    trap 'echo -n "error occured with signal [6]: Abort from: " >> $nplog ; \
    awk "NR==$LINENO" $0 | sed "s/^[ \t]*//" >> $nplog ; exit 6' 6

    trap 'echo -n "error occured with signal [9]: Killed from: " >> $nplog ; \
    awk "NR==$LINENO" $0 | sed "s/^[ \t]*//" >> $nplog ; exit 9' 9

    trap 'echo -n "error occured with signal [15]: Dying on signal from: " >> $nplog ; \
    awk "NR==$LINENO" $0 | sed "s/^[ \t]*//" >> $nplog ; exit 15' 15

    # --------------------
    # Program.
    # --------------------

    if [ -d $rep ]; then
    /usr/local/bin/cvsup -g -L 2 /root/cvsup/ports-supfile
    cd /usr/ports && make fetchindex
    cd /usr/ports && make index
    /usr/local/sbin/portsdb -Uu
    ohyes
    else
    nostop
    fi

    # End of file
    Il fonctionne mais je bloque sur un point. Il est possible que les commandes make index et portsdb s'arrêtent normalement tout en générant un message d'erreur code 1 que je ne peux récupérer via trap. Je cherche donc une solution qui permet de récupérer ce message d'erreur ? Autrement, il indique que l'arbre des ports est à jour tout en sachant que la commande a échoué.

    Merci

    ++

Discussions similaires

  1. Intercepter les resultats d'une commande
    Par b_reda31 dans le forum C++Builder
    Réponses: 1
    Dernier message: 06/10/2010, 09h19
  2. intercepter les erreurs
    Par agrotic dans le forum ASP
    Réponses: 2
    Dernier message: 15/02/2008, 14h03
  3. Gestion des erreurs sur une commande multiple
    Par domiq44 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 05/10/2006, 15h03
  4. [VB6]Gérer les espaces dans une command FTP
    Par ShortcutZ dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 24/07/2006, 21h28
  5. Rediriger les erreurs d'une commande
    Par GLDavid dans le forum Langage
    Réponses: 9
    Dernier message: 10/11/2005, 21h03

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