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


40

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

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

echo "PROCESS TERMINATED"

Відповіді:


66

Ключ - команда "чекати":

#!/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

2
Дякую, це, безумовно, єдина відповідь, яка відповідає на мою інтерпретацію оригінального питання (і причину, чому я закінчився переглядом цього питання)
Марк Бут

@cuonglm, що існує декілька процесів? Можливо wait, для цього більше підходить?
Нішант

@cuonglm що робить -0 варіант вбити команду робити
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 каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.