Jak tylko dostrzeżone tutaj problemem jest to, że trzeba czekać, że programy, które biegną od skryptu zakończyć pracę.
Jeśli w swoim skrypcie uruchamiasz program w tle , możesz spróbować czegoś więcej.
Generalnie wywołanie sync
przed wyjściem pozwala opróżnić bufory systemu plików i może trochę pomóc.
Jeśli w skrypcie uruchamiasz niektóre programy w tle ( &
), możesz poczekać , aż zakończą się, zanim wyjdziesz ze skryptu. Aby dowiedzieć się, jak to działa, możesz zobaczyć poniżej
#!/bin/bash
program_1 &
PID_PROGRAM_1=${!}
program_2 &
wait ${!}
daemon_1 &
program_3 &
PID_PROGRAM_3=${!}
sync
wait $PID_PROGRAM_1
wait $PID_PROGRAM_3
Ponieważ wait
działa zarówno z zadaniami, jak iz PID
liczbami, leniwym rozwiązaniem powinno być umieszczenie na końcu skryptu
for job in `jobs -p`
do
wait $job
done
Trudniejsza jest sytuacja, jeśli uruchamiasz coś, co uruchamia coś innego w tle, ponieważ musisz wyszukać i poczekać (jeśli tak jest) na koniec całego procesu potomnego : na przykład, jeśli uruchamiasz demona, prawdopodobnie tak nie jest czekać, kończy się :-).
Uwaga:
czekaj $ {!} oznacza „czekaj, aż zakończy się ostatni proces w tle”, gdzie $!
jest PID ostatniego procesu w tle. Tak więc wstawienie wait ${!}
tuż po program_2 &
jest równoważne wykonaniu bezpośrednio program_2
bez wysyłania go w tle za pomocą&
Z pomocy wait
:
Syntax
wait [n ...]
Key
n A process ID or a job specification