Ответы:
Ключом является команда "ждать":
#!/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 $!;
С помощью wait
вы можете получить необходимую гранулярность:
sleep 1 &
PID1=$!
sleep 2 &
PID2=$!
wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'
Вот один из способов сделать это:
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
, больше подходит для этого?
Вы можете запустить ваш процесс с помощью nohup и написать сценарий оболочки для чтения файла nohup.out, который nohup использует для входа в систему.
nohup command &
nohup
не пишет ничего nohup.out
; он просто создает файл и перенаправляет вывод команды в него. (2) Если команда не выдаст никакого вывода, ничего не будет записано nohup.out
, и эта идея быстро никуда не денется. (3) Даже если command
записывает вывод, как вы можете определить, когда он заканчивается, контролируя этот вывод?
lsof
чтобы увидеть, nohup
все еще использует nohup.out
, но я согласен, что это очень волосатый метод.
command
начинает работать, nohup
ушел. (1) Да, я повторяю число, потому что я повторяю то, что сказал два года назад: nohup
ничего не пишет nohup.out
. (5) Да, вы можете написать сценарий оболочки для цикла и запуска, lsof
чтобы увидеть, nohup.out
открыт ли он. Но это был бы другой ответ. (6) Даже если бы вы сделали это, это было бы ненадежно. Что, если какой-то другой процесс открыл nohup.out
файл? Вы действительно хотели бы проверить, был ли этот конкретный процесс nohup.out
открыт. (7) Но, если вы собираетесь это сделать, почему бы просто не проверить, запущен ли процесс?