Запустите фоновый процесс и проверьте, когда он заканчивается

41

Как я могу запустить процесс в фоновом режиме и проверить, когда он заканчивается в скрипте bash? Моя идея - такой скрипт:

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

echo "PROCESS TERMINATED"
0wn3r
источник

Ответы:

68

Ключом является команда "ждать":

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"
Паскаль Шмиль
источник
7
Преимущество этого: он НЕ сжигает процессорное время с бесконечным циклом, работающим все время ....;)
Паскаль Шмиэль
2
Недостатком этого является то, что вы не можете больше ничего делать во время ожидания, например, указывать пользователю прогресс. Только решение cuonglm позволяет вам сделать это.
Марк Бут
3
@Mark Booth Вы можете указать прогресс с третьим асинхронным заданием. Например:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
Уильям Перселл
32

С помощью waitвы можете получить необходимую гранулярность:

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

wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'
Мирча Вуцовичи
источник
29

Вот один из способов сделать это:

launch backgroundprocess &
PROC_ID=$!

while kill -0 "$PROC_ID" >/dev/null 2>&1; do
    echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
exit 0
cuonglm
источник
2
Спасибо, это, безусловно, единственный ответ, который отвечает на мою интерпретацию исходного вопроса (и причину, по которой я остановился на этом вопросе)
Марк Бут
@cuonglm, что есть несколько процессов? Наверное wait, больше подходит для этого?
Nishant
@cuonglm, что делает опция -0 для команды kill
k_vishwanath
1
@k_vishwanath сообщает, работает ли процесс или нет.
Cuonglm
0

Вы можете запустить ваш процесс с помощью nohup и написать сценарий оболочки для чтения файла nohup.out, который nohup использует для входа в систему.

  nohup command &
Абхишек Ананд Амралкар
источник
4
(1) С риском расщепления волос, nohupне пишет ничего nohup.out; он просто создает файл и перенаправляет вывод команды в него. (2) Если команда не выдаст никакого вывода, ничего не будет записано nohup.out, и эта идея быстро никуда не денется. (3) Даже если commandзаписывает вывод, как вы можете определить, когда он заканчивается, контролируя этот вывод?
G-Man говорит: «Восстановите Монику»
@ G-Man может быть, проверив вывод, lsofчтобы увидеть, nohupвсе еще использует nohup.out, но я согласен, что это очень волосатый метод.
Алексей Магура
(4) К тому времени, когда commandначинает работать, nohupушел. (1) Да, я повторяю число, потому что я повторяю то, что сказал два года назад: nohupничего не пишет nohup.out. (5) Да, вы можете написать сценарий оболочки для цикла и запуска, lsofчтобы увидеть, nohup.outоткрыт ли он. Но это был бы другой ответ. (6) Даже если бы вы сделали это, это было бы ненадежно. Что, если какой-то другой процесс открыл nohup.outфайл? Вы действительно хотели бы проверить, был ли этот конкретный процесс nohup.outоткрыт. (7) Но, если вы собираетесь это сделать, почему бы просто не проверить, запущен ли процесс?
G-Man говорит: «Восстановите Монику»