Exécution séquentielle de programmes sous Unix

J’ai plusieurs programmes à exécuter dans un certain ordre (p1 puis p2 puis p3 puis p4). Normalement, je ferais simplement un script simple ou taperais p1 && p2 && p3 && p4.

Cependant, ces programmes ne doivent pas sortir correctement. Je sais seulement que c’est fini avec succès lorsque “Success” est imprimé. Actuellement, je SIGINT une fois que je vois “Success” ou “Fail”, puis lancez manuellement le programme suivant s’il est “Success”.

Existe-t-il un moyen plus simple d’exécuter séquentiellement p1, p2, p3, p4 avec moins d’intervention humaine?

Edit: Actuellement en utilisant ksh, mais cela ne me dérangerait pas de connaître les autres aussi.

Dans bash, vous pouvez diriger la commande vers grep à la recherche de ‘Success’, puis utiliser le code de résultat de grep. L’astuce consiste à envelopper toute l’expression dans des accolades pour obtenir un sous-shell en ligne. Ainsi:

$ cat foo.sh #!/bin/bash [ 0 -eq $(( $RANDOM %2 )) ] && echo 'Success' || echo 'Failure' exit 0 $ { ./foo.sh | grep -q 'Success'; } && ls || df 

La partie entre accolades ( {} ) renvoie 0 si “Succès” est dans la sortie, sinon 1, comme si la commande foo.sh l’avait fait lui-même. Plus de détails sur cette technique.

Je n’ai pas utilisé ksh depuis longtemps, mais je pense qu’il y a une construction similaire .

Je suis également nouveau pour la programmation Linux, mais j’ai trouvé quelque chose qui pourrait vous être utile. Avez-vous essayé d’utiliser la commande ” wait “?

de cette réponse sur stackexchange:

 sleep 1 & PID1=$! sleep 2 & PID2=$! wait $PID1 echo PID1 has ended. wait echo All background processes have exited. 

Je ne l’ai pas testé moi-même, mais cela ressemble à ce que vous avez décrit dans votre question.

toutes les réponses jusqu’à présent fonctionneraient correctement si vos programmes se terminaient réellement. Voici quelques idées que vous pouvez utiliser dans la documentation pour plus de détails.

1st – l’option serait de modifier vos programmes pour qu’ils se terminent après l’impression du message de résultat en retournant un code de réussite.

2ème – si possible utiliser des fourches.

écrivez une main à chaque fois que vous voulez exécuter un programme.

  • dans le processus fils, utilisez dup2 pour avoir la sortie du processus dans un fichier de votre choix.

  • dans l’ensemble, continuez à vérifier le contenu de ce fichier jusqu’à ce que vous obteniez quelque chose et que vous le compariez avec succès ou échec. -empty le fichier.

  • alors vous pouvez faire un autre fork et exécuter le programme suivant.
  • répétez la même opération à nouveau.

N’oubliez pas qu’exécuter est une commande qui remplace le code du processus dans lequel elle est exécutée par le code du fichier transmis en tant que paramètre, faites donc l’appel dup2 en premier.

Lorsque votre programme renvoie Réussite ou Échec et continue à s’exécuter, vous devez le tuer dès que la chaîne passe.

Faire une fonction comme

 function startp { prog=$1 ./${prog} | while read -r line; do case "${line}" in "Success") echo OK mykill $prog exit 0 ;; "Fail") echo NOK mykill $prog exit 1 ;; *) echo "${line}" ;; esac done exit 2 } 

Vous devez append une fonction mykill qui recherche le programme px et la tue (xargs lui convient bien).

Appelez la fonction comme

 startp p1 && startp p2 && startp p3