Если мы используем, echo 1234 >> some-fileто Документация говорит, что вывод добавлен.
Я предполагаю, что если некоторый файл не существует, то O_CREAT создаст новый файл. Если >был использован, то O_TRUNC будет обрезать существующий файл.
В случае >>: Будет ли файл открыт как O_WRONLY (или O_RDWR) и найден конец и операция записи выполнена, имитируя O_APPEND? Или файл будет открыт как O_APPEND, оставляя его ядру, чтобы убедиться, что добавление произойдет?
Я спрашиваю об этом, потому что процесс сохранения перезаписывает некоторые маркеры, вставленные с помощью echo, когда выходной файл находится в точке монтирования NFS, а в документации NFS говорится, что O_APPEND не поддерживается на сервере, поэтому ядру клиента придется с этим справляться. Я предполагаю, что процесс сохранения использует O_APPEND, но не уверен в bash >>на linux, поэтому задаю вопрос здесь.
O_APPENDона не поддерживается; проблема в том, что это эмулируется. В локальной файловой системе несколько процессов, выполняющих запись в один и тот же открытый файлO_APPEND, никогда не будут перезаписывать данные друг друга; в NFSO_APPENDэмулируется путем поиска до конца перед записью, что оставляет возможность состязаний. На NFS нет пути к этому; каждый параллельный писатель должен написать свой собственный файл. Единственный способ обойти это - настроить серверный процесс на NFS-сервере, сделать так, чтобы регистраторы входили в систему|nc server portи сервер добавлял входящие данные в журнал.