j'ai 3 scripts (A, B, C) que je voudrais l'un après l'autre uniquement si le premier est terminé. Pour le moment, si A.sh termine, il passe à B.sh, mais si B.sh échoue, il n'exécutera aucune idée sur la manière de résoudre ce problème, s'il vous plaît. je les fais passer par cron comme:
30 6,14 * * 1-5/home/user/scripts/A.sh ; /home/user/scripts/B.sh ; /home/user/scripts/C.sh ;
Des idées s'il vous plaît?
Vous pouvez créer un script qui appelle les autres scripts de manière organisée, comme suit: Ceci est votre fichier cron
,
30 6,14 * * 1-5/home/utilisateur/scripts/A-B-C.sh
Ensuite, le script A-B-C.sh
est défini comme suit:
#!/bin/bash
# Run script A,B,C
# execute script A
./home/user/scripts/A.sh
#execute script B
./home/user/scripts/B.sh
enter code here
#execute script C
./home/user/scripts/C.sh
Si vous voulez\ne veulent pas exécuter le script B.sh
et C.sh
dans les cas où le script A.sh
contient une erreur, vous pouvez inclure le suivi des erreurs à l'aide de variables dont vous pouvez conserver la valeur en tant que 0
ou 1
. Ensuite, si le script précédent ne se termine pas comme prévu, vous pouvez prendre la décision nécessaire quant à l'utilisation du script suivant. Un exemple est le suivant,
#!/bin/bash
# Run script A,B,C
# Exit code and default run code initialization
exit_A=0
exit_B=0
def_B=1
def_C=1
#----------------------------------------------
# execute script A
. ./home/user/scripts/A.sh $exit_A #make sure to change the value of exit_A to 1 if A finishes as expected.
if [$exit_A==1] && [def_B==1] #only if A finishes without error and B is ok
then
#execute script B
. ./home/user/scripts/B.sh $exit_B
else
<do something like log>
fi
if [$exit_B==1] && [def_C==1] #only if B finishes without error and C is ok
then
#execute script C
. ./home/user/scripts/C.sh $exit_C
else
<do something like log>
fi
now="$(date +'%d/%m/%Y-%T')"
#make a log in a file (print can be used for better formatting)
echo -e $now,$exit_A,$exit_B,$exit_C >> /home/user/log/script_log.txt
Dans le script ci-dessus, les variables sont transmises à travers les scripts. Utilisez avec prudence et testez avant d'utiliser le code.
Une façon plus élégante de créer ce travail cron serait:
30 6,14 * * 1-5 /home/user/scripts/A.sh && /home/user/scripts/B.sh && /home/user/scripts/C.sh
Cela entraînera l'exécution simultanée des trois tâches. Vous pouvez faire $HOME/scripts/A.sh
si vos variables sont définies en conséquence.
Pour le contrôle de base des tâches, par exemple en vous assurant que le script 2 ne s'exécute que si le script 1 réussit, vous pouvez ajouter une ligne pour exit = 0 afin d'écrire un fichier temporaire tel que/tmp/script-1_success.
Puis, au début de script-2, demandez-lui de vérifier si/tmp/script-1_success existe. Sinon, faites-le sortir.