Se usiamo, la echo 1234 >> some-file
documentazione dice che l'output è stato aggiunto.
La mia ipotesi è che, se un file non esiste, O_CREAT creerà un nuovo file. Se è >
stato utilizzato, O_TRUNC troncherà il file esistente.
In caso di >>
: Il file verrà aperto come O_WRONLY (o O_RDWR) e cercherà di terminare e l'operazione di scrittura è stata eseguita, simulando O_APPEND? O il file verrà aperto come O_APPEND, lasciandolo al kernel per assicurarsi che accada l'aggiunta?
Lo sto chiedendo perché un processo di conservazione sta sovrascrivendo alcuni marcatori inseriti da eco, quando il file di output proviene dal punto di montaggio NFS e la documentazione NFS dice che O_APPEND non è supportato sul server, quindi il kernel client dovrà gestirlo. Immagino che il processo del conservatore stia usando O_APPEND, ma non sono sicuro di bash >>
su Linux, quindi ponendo la domanda qui.
O_APPEND
è che non è supportato; il problema è che è emulato. Su un file system locale, diversi processi che scrivono nello stesso file aperto conO_APPEND
non si sovrascriveranno mai reciprocamente i dati; su NFS,O_APPEND
viene emulato cercando fino alla fine prima di scrivere, il che lascia la possibilità di condizioni di gara. Non c'è modo di aggirare questo su NFS; ogni scrittore parallelo deve scrivere il proprio file. L'unico modo per aggirare questo problema è impostare un processo server sul server NFS, fare in modo che i logger accedano|nc server port
e fare in modo che il server acceda i dati in entrata al registro.