Uruchom proces w tle i sprawdź, kiedy się zakończy


40

Jak mogę uruchomić proces w tle i sprawdzić, kiedy zakończy się w skrypcie bash? Mój pomysł to taki skrypt:

launch backgroundprocess &
while [ Process is running ];do
   echo "PROCESS IS RUNNING\r"
done;

echo "PROCESS TERMINATED"

Odpowiedzi:


66

Kluczem jest polecenie „czekaj”:

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"

7
Korzyści z tego: NIE spala czasu procesora przy nieskończonej pętli działającej cały czas ....;)
Pascal Schmiel

2
Wadą tego jest to, że nie możesz zrobić nic innego podczas oczekiwania, na przykład wskazując postęp użytkownikowi. Tylko rozwiązanie cuonglm pozwala to zrobić.
Mark Booth

3
@ Mark Booth Możesz wskazać postęp w trzecim zadaniu asynchronicznym. np .:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell

32

Dzięki temu waitmożesz uzyskać szczegółowość, której potrzebujesz:

sleep 1 &
PID1=$!
sleep 2 &
PID2=$!

wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'

29

Oto jeden ze sposobów, aby to zrobić:

launch backgroundprocess &
PROC_ID=$!

while kill -0 "$PROC_ID" >/dev/null 2>&1; do
    echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
exit 0

2
Dzięki, to zdecydowanie jedyna odpowiedź, która odpowiada mojej interpretacji pierwotnego pytania (i powód, dla którego skończyłem na tym pytaniu)
Mark Booth

@cuonglm, Co to jest wiele procesów? Prawdopodobnie waitjest bardziej odpowiedni do tego?
Nishant,

@cuonglm co robi -0 opcja wykonania polecenia kill
k_vishwanath

1
@k_vishwanath informuje, czy proces nadal działa, czy nie.
cuonglm

0

Możesz uruchomić swój proces z nohup i napisać skrypt powłoki, aby odczytać plik nohup.out, którego loguje nohup.

  nohup command &

4
(1) Ryzykując rozdwajanie włosów, nohupnic nie pisze nohup.out; tworzy jedynie plik i przekierowuje do niego dane wyjściowe polecenia. (2) Jeśli polecenie nie wygeneruje żadnego wyniku, nic nie zostanie zapisane nohup.out, a ten pomysł szybko się nie skończy . (3) Nawet jeśli commandzapisuje dane wyjściowe, jak rozpoznać, kiedy się kończy, monitorując dane wyjściowe?
G-Man mówi „Przywróć Monikę”

@ G-Man może sprawdzając wyjście lsofaby zobaczyć, czy nohupjest nadal używa nohup.out, ale zgadzam się że jest to metoda bardzo owłosione.
Alexej Magura

(4) Gdy czas commandzaczyna biec, nohupjuż go nie ma. (1) Tak, powtarzam liczbę, ponieważ powtarzam to, co powiedziałem dwa lata temu: nohupnic nie pisze nohup.out. (5) Tak, możesz napisać skrypt powłoki, aby wykonać pętlę i uruchomić, lsofaby sprawdzić, czy nohup.outjest nadal otwarty. Ale to byłaby inna odpowiedź. (6) Nawet gdybyś to zrobił, byłoby to niewiarygodne. Co się stanie, jeśli jakiś inny proces otworzy nohup.outplik? Naprawdę chcesz sprawdzić, czy ten konkretny proces został nohup.outotwarty. (7) Ale jeśli zamierzasz to zrobić, dlaczego nie sprawdzić, czy proces działa?
G-Man mówi „Przywróć Monikę”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.