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