Как только что заметили здесь проблему, вам нужно подождать, пока программы, которые вы запускаете из своего скрипта, завершат свою работу.
Если в вашем скрипте вы запускаете программу в фоновом режиме, вы можете попробовать что-то еще.
В общем, вызов 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