Mam (jeszcze) inną wait
, &
, &&
pytanie przepływu sterowania ..
Powiedzmy, że mam skrypt taki jak ten, w którym chcę wykonać jak najwięcej pracy w tym samym czasie:
# 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
Pytanie 1: Czy w skrypcie combine
czeka , aż oba somethingElse
procesy zakończą się, dopóki oba something
procesy będą kontynuowane?
Pytanie 2: Jeśli nie - i podejrzewam, że nie - jak mogę combine
czekać tylko na oba somethingElse
procesy, podczas gdy something
powyższe procesy nadal działają w tle?
źródło
Byłoby podstawienie proces będzie bardziej efektywny, zwłaszcza jeśli nie ma potrzeby, aby zapisać pliki
OutputA
iOutputB
, i dbają tylko oResult
? Czy byłoby to szczególnie oszczędzające czas, ponieważ jeśli masz wolne operacje we / wy w zapisywaniu na dysk, zapisywanie plikówOutputA
iOutputB
może to być etap ograniczający szybkość?Podstawianie procesów pozwala umieścić polecenie w środku
<(..here..)
zamiast zapisywać dane wyjściowe w pliku, a następnie odczytywać je jako dane wejściowe w kroku „łącz”.Jeśli pamięć jest ograniczeniem, a rozmiar
outputA
ioutputB
więcej niż pamięć może pomieścić, czy uda mu się pokonać cały cel?Czy
combine
zaczekaj, aż oba procesy zostaną zakończone, zanim zacznie działać?źródło
combine
zacznie działać, gdy tylko uruchomią się dwasomethingElse
polecenia, ale to jest OK, ponieważ<(…)
rzeczy są potokami; więccombine
będzie po prostu zmuszony czekać na dane, jeśli przekroczy tosomethingElse
procesy. Ponieważ są rurami, rozmiar nie stanowi problemu. … (Ciąg dalszy)somethingElse
procesów - i nie jest do końca jasne, czy jest to ważne dla pytającego. Ale odpowiedź nie powinna zadawać takich pytań.Możesz użyć
wait
polecenia:Możesz zobaczyć, że linia „początkowa” dzieje się od razu, a „gotowe” czeka przez 10 sekund.
źródło
Dokładnie pokazuję, jak można tego dokonać w innej odpowiedzi tutaj . Ta odpowiedź była na pytanie o to, czy 2 dzienniki były utrzymywane przez proces w tle, więc zademonstrowałem to z 10.
Skrypt demonstracyjny
Uruchom wersję demonstracyjną
Wynik:
Powyższe pokazuje. Buduje i uruchamia skrypt o nazwie
/tmp/script
,chmod
„s go jako plik wykonywalny, a uruchamia go w&background
tematyce&backgrounded ( subshell )
.Skrypt
rms /tmp/file0-9
10 plików iechoes
linia co sekundę we wszystkich 10 z nich. Przechwytuję niektóre$info
z odrzuconego procesu i prezentuję je za pomocą$(command substitution). While ps
raportów z$pid
przechwytywania, wiem, że nadal działa, więc Isleep.
Po zakończeniu wiersze we wszystkich 10 plikach są liczonewc.
Po wywołaniu procesu w ten sposób możesz swobodnie zamknąć jego pierwotny proces nadrzędny, a on będzie kontynuował przewóz - jest on skutecznie odrzucany. Oznacza to również, że nie można korzystać z tradycyjnego
wait
polecenia, ale czeka naps
„s zwrotu powinny być bardziej wytrzymałe w każdym przypadku.Warto wspomnieć, jak sądzę, jest to, że proces ten jest rzeczywiście początkowo wezwany
$(command substitution)
iprintfs
ME$info
Chcę więc mogę skutecznie kontrolować. Ale jak tylko upuści swoje wyjście terminalowe za pomocąexec 1>&2
(który jest zamknięty w tej samej podpowłoce z2>&-
), proces ucieka i muszę czekać na to z drugiej strony. Niby najlepszy z obu światów, zwłaszcza jeśli używasz go do obsługi rur wejściowych, o ile możesz otoczyć wszystkie przekierowania i liderów procesów.Wszystko inne służy tutaj tylko do demonstracji. Wszystko, czego potrzebujesz, aby uruchomić, to najwyższy skrypt i:
UWAGA: To drukuje tylko na terminalu dokładnie to, co chciałem to zademonstrować. Jak zauważono w
$PPID,
tym procesie, ten proces jest odrzucany przez terminal i jest bezpośrednim potomkiem$PID 1.
Jeśli chcesz uruchomić dwa z nich jednocześnie i poczekać na nie, możesz po prostu
ps
podać oba ich numery i czekać.źródło