Se usiamo, la echo 1234 >> some-filedocumentazione 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_APPENDnon si sovrascriveranno mai reciprocamente i dati; su NFS,O_APPENDviene 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 porte fare in modo che il server acceda i dati in entrata al registro.