Comment exécuter une séquence de scripts bash un par un sous Linux?

1

J'ai plusieurs scripts bash, ou plutôt un script qui doit être exécuté plusieurs fois.

Ce script accepte plusieurs arguments de ligne de commande et fait quelque chose avec eux. J'ai besoin d'exécuter ce script plusieurs fois de suite, en transmettant différentes valeurs d'argument. Le problème est que ce script est très long et que son exécution prend beaucoup de temps.

Je veux exécuter ce script une fois, avec quelques arguments. Ensuite, je souhaite exécuter à nouveau ce script immédiatement, en transmettant différentes valeurs d'argument cette fois.

Je dois donner mes résultats finis à mon patron demain matin. Une solution consisterait simplement à exécuter le script une fois, puis à rester assis devant l'ordinateur toute la nuit, en attendant qu'il se termine, puis à réexécuter le script. Mais le manque de sommeil n'est pas une option pour moi.

Existe-t-il un moyen d'automatiser l'exécution de scripts avec des valeurs d'argument prédéterminées? À propos, il me faut non seulement voir le résultat final des scripts, mais également le script tel qu'il a été transmis à la ligne de commande avec les arguments appropriés.

Peut-être vaudrait-il mieux regarder cette image pour mieux comprendre ma question.

screenshot

Galaxy
la source
Vous pouvez être intéressé par la commande bash wait (voir man bash ou help wait de bash), probablement pas nécessaire ici, mais il faudra attendre un processus / PID ou tous les enfants pour terminer
Xen2050

Réponses:

0

Tu as besoin d'un for boucle:

cd ~/Desktop/344/08
for arg in --resources --requesters --errors
do
    echo Starting: ./log_parse.sh "$arg" --day 10-20 --number 10 access_log_Jul95
    ./log_parse.sh "$arg" --day 10-20 --number 10 access_log_Jul95
done

Peut-être voudrez-vous sauvegarder une copie de la sortie dans un fichier journal et l'afficher sur un écran:

cd ~/Desktop/344/08
{
    for arg in --resources --requesters --errors
    do
        echo Starting: ./log_parse.sh "$arg" --day 10-20 --number 10 access_log_Jul95
        ./log_parse.sh "$arg" --day 10-20 --number 10 access_log_Jul95
    done
} 2>&1 | tee output.log

Placez le code ci-dessus dans un fichier appelé, par exemple, script.sh. Ensuite, à l'invite de commande, exécutez:

bash ./script.sh
John1024
la source
Alors, comment puis-je utiliser exactement cette boucle? Dois-je d'abord créer un script, puis y insérer la boucle for? Est-il vraiment possible d'avoir un script qui en lancerait un autre?
Galaxy
@ Galaxy Oui, c'est exactement ce que vous faites. Et, oui, les scripts peuvent exécuter des scripts qui peuvent exécuter des scripts .....
John1024
Donc vous n’avez pas besoin du #!/bin/bash ligne lors de l'appel d'un script avec bash script?
Xen2050
Correct. En appelant bash script (où script est le nom complet du fichier, y compris toute extension), le #!/bin/bash la ligne est facultative.
John1024
0

Le moyen le plus simple d’exécuter une commande après l’autre est d’utiliser simplement; Comme:

command1 --options;command2 --options;command3 --options

Si vous souhaitez ignorer les commandes en cours si la précédente échoue, vous pouvez le faire avec & amp; & amp ;:

 command1 --options && command2 --options && command3 --options

Contrairement à pipe (|) ou à esperluette (& amp;), le point-virgule attend la fin de la commande avant l'exécution de la commande suivante.

DocWeird
la source
0

Vérifier le spouleur de tâches ( http://vicerveza.homeunix.net/~viric/soft/ts/ ) - il existe des paquets pour Debian.

Fondamentalement, vous pouvez l’installer, puis exécuter un tas de tsc {script} {arguments} et il va empiler la commande dans une file d'attente sur laquelle le spouleur travaille en arrière-plan.

LawrenceC
la source