Come appena individuato qui il problema è che devi aspettare che i programmi che esegui dal tuo script finiscano il loro lavoro.
Se nel tuo script esegui il programma in background puoi provare qualcosa di più.
In generale una chiamata a sync
prima di uscire consente di svuotare i buffer del file system e può aiutare un po '.
Se nello script avvii alcuni programmi in formato background ( &
), puoi aspettare che finiscano prima di uscire dallo script. Per avere un'idea di come può funzionare puoi vedere di seguito
#!/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
Poiché wait
funziona sia con i lavori che con i PID
numeri, una soluzione pigra dovrebbe essere quella di mettere alla fine dello script
for job in `jobs -p`
do
wait $job
done
Più difficile è la situazione se esegui qualcosa che esegue qualcos'altro in background perché devi cercare e attendere (se è il caso) la fine di tutto il processo figlio : ad esempio se esegui un demone probabilmente non è così aspettare che finisca :-).
Nota:
wait $ {!} significa "aspetta fino al completamento dell'ultimo processo in background" dove $!
è il PID dell'ultimo processo in background. Quindi per metterewait ${!}
subito dopo program_2 &
equivale a eseguire direttamente program_2
senza inviarlo in background con&
Con l'aiuto di wait
:
Syntax
wait [n ...]
Key
n A process ID or a job specification