Je veux générer deux processus enfants, mais attendez que le premier atteigne un certain point dans son exécution (qui peut être déterminé en examinant stdout) avant de générer le second. Je ne sais pas quelles commandes unix seraient impliquées pour accomplir cela, et j'ai eu du mal à trouver quoi que ce soit via google en raison de la nature concise et parfois cryptique des noms de commande unix.
Je ne cherche pas une solution au problème spécifique que j'essaie de résoudre (bien que des pointeurs supplémentaires soient appréciés), je me préoccupe principalement de savoir quelles commandes Unix je voudrais rechercher et apprendre à utiliser.
bash
bash-scripting
w.brian
la source
la source
Réponses:
Vous pouvez utiliser l'
xargs
utilitaire pour cela. Il peut exécuter une commande pour chaque ligne sur stdin, il nous suffit donc de nous assurer qu'ilxargs
obtient en entrée une seule ligne sur stdin au moment où il doit démarrer la commande, ce qui peut être accompli avecgrep
:Les arguments
--max-count=1
,--max-lines=1
et--no-run-if-empty
assurez-vous qu'ilproc2
est démarré exactement une fois si et quandproc1
sort${targetString}
pour la première fois, et jamais siproc1
jamais ne sort${targetString}
. L'--replace
évite quixargs
ajoute la ligne d'entrée à sa ligne de commande.J'ai utilisé la ligne de commande suivante pour le tester:
la source
Je ne suis pas sûr qu'il existe 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 de 1 des ce qui suit, et peut-être d'autres choses que je ne connais pas encore:
L'écriture et la vérification des fichiers de verrouillage est également une pratique courante (astuce pro - si vous avez le contrôle de l'environnement, écrivez sur le disque virtuel plutôt que / tmp - sur de nombreuses distributions, il s'agit de / dev / shm).
la source
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 comparez chaque ligne avec ce que vous recherchez. Une fois trouvé, exécutez proc2.
Si "un certain point dans son exécution" peut être déterminé parstdout
, qu'en est-il des éléments suivants?proc1 | grep "stdout trigger string" && proc2
&&
devrait se déclencher augrep
retour0
, ce qu'il ne fait que lorsqu'il trouve une correspondance.la source
proc2 &
et ensuitebreak
, cela ne se produirait pas, mais cela fermerait le tuyau et ferait se terminer prématurément proc1. Vous pouvez également définir un indicateur une fois que proc2 est démarré et l'utiliser pour vous assurer que proc2 n'est pas exécuté à nouveau. Comme pour l'autre réponse, le reste de la sortie proc1 est ignoré, donc si vous en avez besoin, plus de travail est nécessaire.|
etgrep
ici).