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