Як просто тут помітили проблему, що вам потрібно почекати, поки програми, які ви запускаєте зі свого сценарію, закінчать свою роботу.
Якщо у вашому сценарії ви запускаєте програму у фоновому режимі, ви можете спробувати щось більше.
Загалом дзвінок до sync
перед виходом дозволяє очистити буфери файлової системи і може трохи допомогти.
Якщо в сценарії ви запускаєте деякі програми у фоновому режимі ( &
), ви можете почекати , поки вони закінчаться, перш ніж вийти зі сценарію. Щоб мати уявлення про те, як він може функціонувати, ви можете побачити нижче
#!/bin/bash
program_1 &
PID_PROGRAM_1=${!}
program_2 &
wait ${!}
daemon_1 &
program_3 &
PID_PROGRAM_3=${!}
sync
wait $PID_PROGRAM_1
wait $PID_PROGRAM_3
Оскільки wait
працює як із завданнями, так і з PID
числами, лінивим рішенням слід поставити в кінці сценарію
for job in `jobs -p`
do
wait $job
done
Складніше ситуація, якщо ви запускаєте щось, що запускає щось інше у фоновому режимі, тому що вам доведеться шукати і чекати (якщо це так) закінчення всіх дочірнього процесу: наприклад, якщо ви запускаєте демон, можливо, це не так чекати, коли закінчиться :-).
Примітка:
wait $ {!} означає "почекати до завершення останнього фонового процесу", де $!
знаходиться PID останнього фонового процесу. Тож ставити wait ${!}
відразу післяprogram_2 &
це рівноцінно виконувати безпосередньо, program_2
не надсилаючи його у фоновому режимі за допомогою&
З допомогою wait
:
Syntax
wait [n ...]
Key
n A process ID or a job specification