Odpowiedzi:
Kluczem jest polecenie „czekaj”:
#!/bin/bash
/my/process &
/another/process &
wait
echo "All processes done!"
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
Dzięki temu wait
moż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.'
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
wait
jest bardziej odpowiedni do tego?
Możesz uruchomić swój proces z nohup i napisać skrypt powłoki, aby odczytać plik nohup.out, którego loguje nohup.
nohup command &
nohup
nic 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 command
zapisuje dane wyjściowe, jak rozpoznać, kiedy się kończy, monitorując dane wyjściowe?
lsof
aby zobaczyć, czy nohup
jest nadal używa nohup.out
, ale zgadzam się że jest to metoda bardzo owłosione.
command
zaczyna biec, nohup
już go nie ma. (1) Tak, powtarzam liczbę, ponieważ powtarzam to, co powiedziałem dwa lata temu: nohup
nic nie pisze nohup.out
. (5) Tak, możesz napisać skrypt powłoki, aby wykonać pętlę i uruchomić, lsof
aby sprawdzić, czy nohup.out
jest 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.out
plik? Naprawdę chcesz sprawdzić, czy ten konkretny proces został nohup.out
otwarty. (7) Ale jeśli zamierzasz to zrobić, dlaczego nie sprawdzić, czy proces działa?