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 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.'
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
waitjest 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 &
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?
lsofaby zobaczyć, czy nohupjest nadal używa nohup.out, ale zgadzam się że jest to metoda bardzo owłosione.
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?