Skip to content

Quelles commandes utiliserais-je pour créer deux processus enfants en série ?

Solution:

Je ne suis pas sûr qu’il y ait une commande/réponse élégante à la question que vous avez posée (c’est-à-dire atteindre un certain point dans son exécution) – mais il existe des outils/techniques qui peuvent être utilisés pour trouver une solution, impliquant probablement plus d’un ce qui suit, et peut-être d’autres choses que je ne connais pas encore :

  1. Processus d’arrière-plan (&)
  2. Exécution conditionnelle (&& et ||)
  3. dormir
  4. attendez (je pense que cela sera particulièrement utile – si vous lancez plus d’un travail en arrière-plan, il attendra que tous les travaux soient terminés)
  5. Pipes nommées (qui pourraient fournir un mécanisme pour communiquer entre les processus).
  6. inodenotifyattendre

L’écriture et la vérification des fichiers de verrouillage sont également une pratique courante (astuce de pro – si vous avez le contrôle de l’environnement, écrivez sur le disque virtuel plutôt que sur /tmp – sur de nombreuses distributions, il s’agit de /dev/shm).

Vous pouvez utiliser le xargs utilitaire pour cela. Il peut exécuter une commande pour chaque ligne sur stdin, nous devons donc simplement nous assurer que xargs obtient en entrée une seule ligne sur stdin au moment où il doit lancer la commande, ce qui peut être accompli avec grep:

proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2

Les arguments --max-count=1, --max-lines=1 et --no-run-if-empty veiller à ce que proc2 est démarré exactement une fois si et quand proc1 les sorties ${targetString} pour la première fois, et jamais si proc1 ne sort jamais ${targetString}. Les --replace évite que xargs ajoute la ligne d’entrée à sa ligne de commande.

J’ai utilisé la ligne de commande suivante pour le tester :

(echo Start >&2; sleep 3 ; echo Trigger; sleep 3; echo End >&2) | grep --max-count=1 Trigger | xargs --max-lines=1 --no-run-if-empty --replace -- echo "Triggered"

Ce n’est qu’une idée, mais demandez au premier processus de diriger sa sortie vers grep. Demandez à grep de diriger sa sortie vers une boucle de ligne de lecture et de comparer chaque ligne avec ce que vous recherchez. Une fois trouvé, exécutez proc2.

#!/bin/bash
targetString="line you are looking for"
proc1 | grep "${targetString}" |
while read line
do
if [ "$line" = "${targetString}" ]; then
    proc2
fi
done

Si « un certain point de son exécution » peut être déterminé par stdout, alors qu’en est-il de ce qui suit ?

proc1 | grep "stdout trigger string" && proc2

&& devrait tirer quand grep Retour 0, ce qu’il ne fait que lorsqu’il trouve une correspondance.



Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.