Перенаправляет ли вывод в файл блокировку в файле?

Если у меня есть команда

$ ./script >> file.log

, который вызывается дважды, со вторым вызовом, предшествующим первому, что происходит?

Получает ли первый вызов эксклюзивную блокировку выходного файла? Если это так, второй скрипт терпит неудачу при попытке записи или оболочка принимает вывод (разрешая завершение сценария) и выдает ошибку?

Или файл журнала записывается дважды?

28 голосов | спросил user20672 7 J000000Saturday12 2012, 23:57:35

2 ответа


17

Поскольку вы используете >>, что означает добавление, каждая строка вывода из каждого экземпляра будет добавлена ​​в том порядке, в котором она произошла .

Если ваш сценарий выводит 1\n через 5\n с задержкой в ​​одну секунду между каждым и вторым экземпляром запускается через 2,5 секунды, вы получите следующее:

1
2
1
3
2
4
3
5
4
5

Итак, чтобы ответить на ваш вопрос: Нет.

ответил bahamat 8 J000000Sunday12 2012, 01:22:11
20

Unix-системы в целом избегают обязательных блокировок. Есть несколько случаев, когда ядро ​​блокирует файл против модификаций пользовательскими программами, но не если он просто написан другой программой. Никакая система unix не будет блокировать файл, потому что программа пишет ему.

Если вы хотите, чтобы параллельные экземпляры вашего скрипта не наступали друг на друга, вам нужно использовать явный механизм блокировки, такой как flock lockfile

Когда вы открываете файл для добавления, который >>, каждая программа будет всегда всегда писать в конец файла. Таким образом, вывод нескольких экземпляров никогда не будет перезаписывать друг друга, и если они по очереди записывают, их вывод будет в том же порядке, что и записи.

Плохая вещь, которая может произойти, заключается в том, что один из экземпляров записывает несколько фрагментов вывода и ожидает, что они выйдут вместе. Между последователями, записываемыми одним экземпляром, другие экземпляры могут выполнять свои собственные записи. Например, если экземпляр 1 пишет foo, тогда экземпляр 2 пишет hello, и только тогда экземпляр 2 пишет bar, тогда файл будет содержать foohellobar

Процесс эффективно записывает в файл, когда он вызывает системный вызов write. Вызов write является атомарным: каждый вызов write записывает последовательность байтов, которая не будет прервана другими программами. Часто существует ограничение на то, сколько данных один вызов write будет эффективно писать: для больших размеров только начало данных и приложение должно снова вызвать write. Кроме того, многие программы выполняют буферизацию : они накапливают данные в области памяти, а затем записывают эти данные в один фрагмент. Некоторые программы очищают выходной буфер после полной линии или другого значимого разделения. С такими программами вы можете ожидать, что целые строки будут бесперебойными, если они не слишком длинны (до нескольких килобайт, это зависит от ОС). Если программа не скрывается в значимых местах, но только на основе размера буфера, вы можете увидеть что-то вроде 4kB из одного экземпляра, затем 4kB из другого экземпляра, затем снова 4kB из первого экземпляра и т. Д.

ответил Gilles 8 J000000Sunday12 2012, 04:26:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132