#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
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
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne