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 :
- Processus d’arrière-plan (&)
- Exécution conditionnelle (&& et ||)
- dormir
- 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)
- Pipes nommées (qui pourraient fournir un mécanisme pour communiquer entre les processus).
- 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.