Как только что заметил здесь проблема в том, что вам нужно ждать, пока программы, которые вы запускаете из своего скрипта, завершат свою работу.
Если в вашем скрипте вы запускаете программу в background , вы можете попробовать что-то еще.
Обычно вызов sync
перед выходом позволяет очистить буферы файловой системы и может немного помочь.
Если в сценарии вы запускаете некоторые программы в background (&
), вы можете дождаться, пока они завершат работу, прежде чем вы выйдете из сценария. Чтобы иметь представление о том, как он может функционировать, вы можете посмотреть ниже
#!/bin/bash
#... some stuffs ...
program_1 & # here you start a program 1 in background
PID_PROGRAM_1=${!} # here you remember its PID
#... some other stuffs ...
program_2 & # here you start a program 2 in background
wait ${!} # You wait it finish not really useful here
#... some other stuffs ...
daemon_1 & # We will not wait it will finish
program_3 & # here you start a program 1 in background
PID_PROGRAM_3=${!} # here you remember its PID
#... last other stuffs ...
sync
wait $PID_PROGRAM_1
wait $PID_PROGRAM_3 # program 2 is just ended
# ...
Поскольку wait
работает с заданиями, а также с PID
числами, ленивое решение должно быть помещено в конец скрипта
for job in `jobs -p`
do
wait $job
done
Более сложной является ситуация, если вы запускаете что-то, что запускает что-то другое в фоновом режиме, потому что вам нужно искать и ждать (если это так) завершения всего процесса child : например, если вы запустите daemon , вероятно, дело не в том, чтобы дождаться его завершения :-).
Примечание:
wait $ {!} Означает «дождаться завершения последнего фонового процесса», где $!
- PID последнего фонового процесса. Таким образом, поставить wait ${!}
сразу после program_2 &
эквивалентно непосредственному выполнению program_2
без отправки его в фоновом режиме с &
С помощью wait
:
Syntax
wait [n ...]
Key
n A process ID or a job specification