web-dev-qa-db-fra.com

cron lance un script après l'autre

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?

3
john

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.

3
ankit7540

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.

3
jones0610