Системы Unix в целом избегают обязательных блокировок. Есть несколько случаев, когда ядро блокирует файл от изменений пользовательскими программами, но не в том случае, если он просто записывается другой программой. Ни одна система unix не заблокирует файл, потому что программа пишет в него.
Если вы хотите, чтобы параллельные экземпляры вашего скрипта не наступали друг другу на ноги, вам нужно использовать явный механизм блокировки, такой как .flock
lockfile
Когда вы открываете файл для добавления, что >>
делает, каждая программа гарантированно всегда записывает в конец файла. Таким образом, выходные данные нескольких экземпляров никогда не будут перезаписывать друг друга, и если они по очереди пишут, их выходные данные будут в том же порядке, что и записи.
Плохая вещь, которая может случиться, если один из экземпляров записывает несколько блоков вывода и ожидает, что они выйдут вместе. Между последовательными записями одного экземпляра другие экземпляры могут выполнять свои собственные записи. Например, если экземпляр 1 записывает foo
, затем экземпляр 2 записывает, hello
и только тогда экземпляр 2 записывает bar
, файл будет содержать foohellobar
.
Процесс эффективно записывает в файл при write
вызове системного вызова. Вызов write
атомарен: каждый вызов write
записывает последовательность байтов, которая не будет прервана другими программами. Часто существует ограничение на то, сколько данных write
будет эффективно записывать один вызов : для больших размеров записывается только начало данных, и приложение должно вызывать write
снова. Кроме того, многие программы выполняют буферизацию: они накапливают данные в области памяти, а затем записывают эти данные в один блок. Некоторые программы очищают выходной буфер после полной строки или другого значимого разделения. С такими программами можно ожидать, что целые строки будут непрерывными, если они не слишком длинные (до нескольких килобайт; это зависит от ОС). Если программа не очищается в значимых местах, а только в зависимости от размера буфера, вы можете увидеть что-то вроде 4 КБ из одного экземпляра, затем 4 КБ из другого экземпляра, затем снова 4 КБ из первого экземпляра и так далее.