I sistemi Unix in generale evitano i blocchi obbligatori. Ci sono alcuni casi in cui il kernel bloccherà un file contro le modifiche dei programmi utente, ma non se viene semplicemente scritto da un altro programma. Nessun sistema unix bloccherà un file perché un programma ci sta scrivendo.
Se vuoi che le istanze simultanee del tuo script non si calpestino sulle dita dei piedi degli altri, devi usare un meccanismo di blocco esplicito come .flock
lockfile
Quando si apre un file per l'aggiunta, il che >>
fa sì che ogni programma scriva sempre alla fine del file. Quindi l'output delle istanze multiple non si sovrascriverà mai a vicenda, e se si alternano per scrivere, il loro output sarà nello stesso ordine delle scritture.
La cosa brutta che potrebbe accadere è se una delle istanze scrive diversi blocchi di output e si aspetta che vengano pubblicati insieme. Tra le scritture consecutive di un'istanza, altre possono eseguire le proprie scritture. Ad esempio, se l'istanza 1 scrive foo
, quindi l'istanza 2 scrive hello
e solo allora l'istanza 2 scrive bar
, il file conterrà foohellobar
.
Un processo scrive efficacemente nel file quando chiama la write
chiamata di sistema. Una chiamata a write
è atomica: ogni chiamata a write
scrive una sequenza di byte che non verrà interrotta da altri programmi. Esiste spesso un limite alla quantità di dati a cui una singola chiamata write
scriverà effettivamente: per dimensioni maggiori, viene scritto solo l'inizio dei dati e l'applicazione deve richiamare write
nuovamente. Inoltre, molti programmi eseguono il buffering: accumulano i dati in un'area di memoria, quindi li scrivono in un blocco. Alcuni programmi scaricano il buffer di output dopo una riga completa o un'altra separazione significativa. Con tali programmi, puoi aspettarti che intere linee siano ininterrotte, purché non siano troppo lunghe (fino a pochi kilobyte; questo dipende dal sistema operativo). Se il programma non scarica in punti significativi, ma solo in base alla dimensione del buffer, potresti vedere qualcosa come 4kB da un'istanza, quindi 4kB da un'altra istanza, quindi ancora 4kB dalla prima istanza e così via.