J'ai (encore) un autre wait
, &
, &&
contrôle question de flux ..
Disons que j'ai un script quelque chose comme ça où je veux faire autant de travail en même temps que possible:
# may take some hours
something InputA > IrrelevantA &
something InputB > IrrelevantB &
# may take an hour
(
somethingElse InputA > OutputA &
somethingElse InputB > OutputB &
)&& combine OutputA OutputB > Result
...morestuff
Question 1: dans le script, combine
attend-on que les deux somethingElse
processus se terminent pendant que les deux something
processus continuent?
Question 2: Sinon - et je soupçonne que ce n'est pas le cas - comment puis-je combine
attendre uniquement les deux somethingElse
processus alors que les something
processus ci-dessus continuent de fonctionner en arrière-plan?
la source
La substitution de processus serait-elle plus efficace, surtout si vous n'avez pas besoin d'enregistrer les fichiers
OutputA
etOutputB
, et ne vous en souciez queResult
? Serait-ce un gain de temps particulièrement important, car si vous avez une E / S lente en écriture sur le disque, l'enregistrement des fichiersOutputA
etOutputB
pourrait être l'étape de limitation de débit?La substitution de processus vous permet de mettre la commande à l'intérieur
<(..here..)
au lieu d'enregistrer la sortie dans un fichier, puis de la lire comme entrée dans l'étape "combine".Si la mémoire est une limitation, et la taille de
outputA
etoutputB
plus que ce que la mémoire peut contenir, va-t-elle aller à l'encontre du but?Attendra
combine
que les deux processus soient terminés avant de démarrer?la source
combine
commencera à s'exécuter dès que les deuxsomethingElse
commandes auront démarré, mais ce n'est pas grave, car les<(…)
choses sont des tuyaux;combine
sera donc simplement obligé d'attendre des données s'il dépasse lessomethingElse
processus. Et, comme ce sont des tuyaux, la taille n'est pas un problème. … (Suite)somethingElse
processus - et il n'est pas tout à fait clair si c'est important pour le demandeur. Mais, aussi, une réponse ne devrait pas être de poser des questions comme ça.Vous pouvez utiliser la
wait
commande:Vous pouvez voir la ligne de "départ" se produire tout de suite, et le "fait" attend 10 secondes.
la source
En fait, je montre exactement comment ce genre de chose pourrait être fait dans une autre réponse ici . Cette réponse était à une question sur la garantie que 2 journaux étaient maintenus par un processus d'arrière-plan, donc je l'ai démontré avec 10.
Script de démonstration
Lancer la démo
Production:
Ce qui précède le démontre. Il construit et exécute un script nommé
/tmp/script
,chmod
« est comme exécutable, et il exécute en&background
un&backgrounded ( subshell )
.Le script
rms /tmp/file0-9
10 fichiers etechoes
une ligne chaque seconde dans chacun des 10 d'entre eux. J'en capture une partie$info
du processus désavoué et je la présente via des$(command substitution). While ps
rapports fixes sur la$pid
capture I, je sais qu'elle s'exécute toujours donc Isleep.
Une fois terminée, les lignes des 10 fichiers sont comptées avecwc.
Après avoir invoqué un processus de cette manière, vous pouvez fermer librement son processus parent d'origine et il continuera à se déplacer - il est effectivement renié. Cela signifie également que vous ne pouvez pas utiliser la classique
wait
commande, mais en attente surps
des » retour devrait être plus robuste dans tous les cas.Il convient de mentionner, je pense, que le processus est en fait initialement appelé
$(command substitution)
etprintfs
que$info
je souhaite que je puisse le contrôler efficacement. Mais dès qu'il laisse tomber sa sortie de terminal avecexec 1>&2
(qui est fermée dans le même sous-shell avec2>&-
), le processus s'échappe et je dois l'attendre à l'autre bout. Un peu le meilleur des deux mondes, surtout si vous l'utilisez pour gérer les canaux d'entrée, tant que vous pouvez vous concentrer sur toutes les redirections et les leaders de processus.Tout le reste est juste pour démonstration ici. Tout ce dont vous avez besoin pour exécuter ceci est le meilleur script et:
REMARQUE: cela imprime uniquement au terminal exactement ce que je voulais démontrer. Comme indiqué par le
$PPID,
processus, ce terminal est renié par le terminal et est un enfant direct de$PID 1.
Si vous vouliez exécuter deux d'entre eux en même temps et les attendre, vous pouvez simplement remettre leurs
ps
deux pids et attendre.la source