À quel point le problème vient d'être repéré ici , c'est que vous devez attendre que les programmes que vous exécutez à partir de votre script terminent leur travail.
Si dans votre script vous exécutez le programme en arrière-plan, vous pouvez essayer quelque chose de plus.
En général, un appel à sync
avant de quitter permet de vider les tampons du système de fichiers et peut aider un peu.
Si dans le script vous démarrez certains programmes en arrière-plan ( &
), vous pouvez attendre qu'ils se terminent avant de quitter le script. Pour avoir une idée de son fonctionnement, vous pouvez voir ci-dessous
#!/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
Puisque wait
fonctionne avec les travaux ainsi qu'avec les PID
nombres, une solution paresseuse devrait être de mettre à la fin du script
for job in `jobs -p`
do
wait $job
done
Plus difficile est la situation si vous exécutez quelque chose qui exécute autre chose en arrière-plan car vous devez rechercher et attendre (si c'est le cas) la fin de tout le processus enfant : par exemple, si vous exécutez un démon, ce n'est probablement pas le cas attendre qu'il se termine :-).
Remarque:
wait $ {!} signifie "attendre que le dernier processus d'arrière-plan soit terminé" où $!
est le PID du dernier processus d'arrière-plan. Donc mettre wait ${!}
juste après program_2 &
équivaut à exécuter directement program_2
sans l'envoyer en tâche de fond avec&
De l'aide de wait
:
Syntax
wait [n ...]
Key
n A process ID or a job specification