Piszę scenariusz, ale jest coś, czego potrzebuję, że nie mogę znaleźć sposobu, aby to zrobić ...
Muszę wykonać polecenie w tle „polecenie1 i”, a następnie gdzieś w skrypcie muszę poczekać, aż zakończy się, zanim wykonam polecenie2. Zasadniczo potrzebuję tego:
UWAGA: każde polecenie działa w określonym katalogu! na końcu pętli while moje polecenie1 utworzyło 4 katalogi, w których w każdym uruchamiany jest określony proces, więc całkowita liczba uruchomionych procesów wynosi 4
a=1
while [$a -lt 4 ]
. command1
#Generates 1 Process
a= `export $a +1`
done
#Wait until the 4 process end and then run the command2
. command2
Widziałem coś o wait
poleceniu z numerem procesu pid, ale to też nie działało.
shell
scripting
background-process
Joao Macau
źródło
źródło
command1
? Czy możesz go zmodyfikować, aby zwracał PID 4 procesów?$!
zmiennej, aby to uzyskać, przekazując ją dowait
polecenia, jak tam pokazałem.$!
zawiera PID ostatniego tła, podczas gdy$$
zawiera PID ostatniego przebiegu procesu.Odpowiedzi:
Możesz użyć polecenia,
wait PID
aby poczekać na zakończenie procesu.Możesz także pobrać PID ostatniego polecenia za pomocą
$!
W twoim przypadku coś takiego działałoby:
Po zakończeniu edycji, ponieważ masz wiele identyfikatorów PID i znasz je, możesz to zrobić:
źródło
Najczystszym sposobem na to będzie mieć swój
comamnd1
zwróci PID uruchomionych procesów i przy użyciuwait
każdego z nich jak sugeruje @ LaurentC za odpowiedź .Innym podejściem byłoby coś takiego:
źródło
Jeśli zastosujesz następującą metodę, możesz nie potrzebować specjalnego „czekania na wszystkie procesy” po pętli while. Pętla zaczeka na zakończenie prądu,
command1
zanim przejdzie do następnego cyklu. Proszę zachować ostrożność jak w przypadku każdej porady. Zauważ, że jedyną rzeczą, którą zrobiłem, było dodanie& wait $!
do końca twojegocommand1
.źródło