Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/03/2015, à 15:50

Dane69

Tester si une commande renvoi une erreur et en executer une autre

Bonjour,

Dans un script, une commande fais un backup de la base de donnée comme ceci :

su postgres -c "pg_dump > backup.out"

J'aimerai que si cette commande renvoi une ou des erreurs, cela exécute une commande spécifique.

Pour cela je pense qu'il faut utiliser un truc du genre : if [ $? -eq 0 ] ; then
mais $? doit être remplacé par quoi exactement ? est ce possible aussi de récupérer le message d'erreur ?

merci d'avance pour votre réponse.

Hors ligne

#2 Le 11/03/2015, à 16:49

Shanx

Re : Tester si une commande renvoi une erreur et en executer une autre

Le plus simple est d'utiliser if :

if commande ; then
    echo "Ca marche"
else
    echo "Ca marche pas
fi

Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#3 Le 11/03/2015, à 16:52

jplemoine

Re : Tester si une commande renvoi une erreur et en executer une autre

$? renvoie l'erreur de la dernière commande. Donc :
ne pas faire un su dans le script mais lancer le script en étant root.
Ensuite tester le résultat de postgres :
s'il renvoie des valeurs différentes en fonction des erreurs, c'est bon.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#4 Le 11/03/2015, à 17:12

Dane69

Re : Tester si une commande renvoi une erreur et en executer une autre

Non jplemoine, le script est déjà exécuté en root mais dans le script la commande de backup ce fait obligatoirement avec le compte postgres car c'est une commande utilisable uniquement avec postgres (commande postgresql) et non avec le compte root.

j'ai fais ceci :

su postgres -c "pg_dumpall > backup.out"

if [$? -eq 0] ; then
echo "envoi mail d'alerte" |mutt -s "MAIL" adressemail@domaine.com
fi"

mais ça ne marche pas, ça me renvoi l'erreur suivante :

./script.sh: line 18: Caractère de fin de fichier (EOF) prématuré lors de la recherche du « " » correspondant
./script.sh: line 32: Erreur de syntaxe : fin de fichier prématurée

Hors ligne

#5 Le 11/03/2015, à 17:27

jplemoine

Re : Tester si une commande renvoi une erreur et en executer une autre

Pardon : je "m'est trompé" en lisant trop vite. Donc, pour ceux qui lirait ne pas tenir compte de la remarque.
Dans le post précédent, il y a un " en trop après le fi --> c'est peut-être ça l'erreur (le script est incomplet).


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#6 Le 11/03/2015, à 17:35

Shanx

Re : Tester si une commande renvoi une erreur et en executer une autre

Si tu souhaites vraiment utiliser cette solution, il faudra changer la condition (là, s'il n'y a pas d'erreur, un mail est envoyé). Il faudrait mettre :

if [$? -ne 0] ; then

Mais je pense que la solution que j'avais proposé en #1 est plus "propre". Elle revient au même, mais utilise pleinement les fonctions de bash (et de if).


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#7 Le 11/03/2015, à 17:40

serged

Re : Tester si une commande renvoi une erreur et en executer une autre

Shanx a écrit :

Le plus simple est d'utiliser if :

if commande ; then
    echo "Ca marche"
else
    echo "Ca marche pas
fi

Voire, plus simple :

commande && echo Ça marche

LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)

Hors ligne

#8 Le 11/03/2015, à 17:51

Shanx

Re : Tester si une commande renvoi une erreur et en executer une autre

Auquel cas il faut prendre en compte les erreurs :

commande && echo "Ca marche" || echo "Ca marche pas"

Par contre, c'est moins lisible, donc j'aurais tendance à préférer les solutions précédentes (surtout si c'est dans un script).


Mes randos : grande traversées des Alpes, de l'Islande, de la Corse, du Japon (en vélo), etc.
Traversée des États-Unis à pied

Hors ligne

#9 Le 11/03/2015, à 20:35

quaego

Re : Tester si une commande renvoi une erreur et en executer une autre

Pour récupérer les messages d'erreur (dans backup.err) :

su postgres -c "pg_dump >backup.out 2>backup.err"

Hors ligne

#10 Le 15/03/2015, à 14:22

tiramiseb

Re : Tester si une commande renvoi une erreur et en executer une autre

Salut,

if [$? -eq 0] ; then

Il manque des espaces.
Rappelez-vous que "[" est une commande, pas un séparateur.

===>

if [ $? -eq 0 ] ; then

Hors ligne