Ответы:
Ключом является команда "ждать":
#!/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) Но, если вы собираетесь это сделать, почему бы просто не проверить, запущен ли процесс?