Безопасно ли открывать файл, который пишется запущенным скриптом?

20

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

Безопасно ли открывать (двойной щелчок) файл, который записывается сценарием?

Никто
источник
4
Что. Также, если вы знаете заранее, вы можете просто передать вывод сценариев через tee.
Хеннес
1
Полусвязанным является команда «tee»: вы можете переслать вывод в некоторый файл и в терминал одновременно: man7.org/linux/man-pages/man1/tee.1.html
Cheiron

Ответы:

42

Чтение файла безопасно, хотя двойной щелчок, который вы упомянули, вероятно, откроет файл в каком-то редакторе, который предложит вам внести изменения и сохранить их. Происходят ошибки, поэтому я рекомендую команды, которые даже не позволят вам изменить файл.

Это примеры, которые работают в терминале; они будут только читать файл:

cat file
less file
less +F file
tail -n 5 file
tail -f file
Камил Мачоровский
источник
4
Многие более умные редакторы файлов предупредят вас, что файл был изменен, и спросят, хотите ли вы его перезагрузить, но глупые редакторы могут этого не делать.
user1306322
5
@ user1306322 Это еще не гарантированно безопасно. Просто потому, что файл открыт для записи, не означает, что он записывается постоянно. Если во время работы редактора ничего не было написано, он не заметит. И поскольку редактор может записать новый файл и переименовать его сверху (поскольку переименования являются атомарными), файл, в который выполняется запись, будет удален. Выходные данные, записанные с этого момента, попадут в удаленный файл.
Касперд
13

Пока ты не пишешь в него, все должно быть в порядке.

Тем не менее, я бы порекомендовал использовать

tail -f log_file

в другом терминале.

Эта команда будет «следовать» за файлом log_fileи записывать вновь добавленное содержимое, как только оно будет обновлено сценарием.

Искуство
источник
1

Недостаточно представителей, чтобы добавить комментарий к ответу Камиля Мачоровского:

Для некоторых файлов вы захотите, tail -F fileчтобы следующее продолжалось через ротацию. Смотрю системный журнал например.

studog
источник
-1

В случае, если сценарий (или базовая реализация платформы) многократно открывает и закрывает дескриптор файла во время своей работы, он может столкнуться с ошибкой нарушения совместного использования в последующем открытом режиме записи по следующим причинам:
1) сценарий может запросить запись доступ в монопольном режиме (исключая одновременный доступ для чтения), поэтому, если ваша программа редактора файлов / программы просмотра еще только читает файл, это может вызвать ошибку в сценарии записи.
2) Кроме того, некоторые редакторы / программы просмотра файлов блокируют файл на весь период, в течение которого они открывают файл.

В заключение, возможны проблемы, которые зависят от программы, которую вы используете для просмотра файла. И возможны проблемы, возникающие из-за реализации (или базовой структуры) сценария, который записывает в файл.

Роланд Пихлакас
источник
1
По моему опыту это очень редко встречается в Linux (примечание: я домашний пользователь). Я знаю, что проблема существует в Windows, хотя вопрос помечен как Linux . Какие «редакторы / зрители» работают так в Linux? В каких разновидностях Linux блокировки обязательны?
Камиль Мачоровски
@KamilMaciorowski К сожалению, у меня нет конкретного списка предупреждений. Блокировки нигде не являются обязательными (и при этом они не под Windows), некоторые люди просто используют их. Я только говорю, что такая проблема возможна, и, пожалуйста, не используйте этот подход небрежно в критических ситуациях. Решение о том, применимо ли это или важно, зависит от ФП. Само существование вышеупомянутого вопроса повышает вероятность того, что такое явление уже произошло для ФП. Ответы, утверждающие, что ничего не могло произойти, также не дают много новой информации.
Роланд Пихлакас
1
@RolandPihlakas Я готов поспорить , автор этого ответа в уже испытал это , - но только на Windows. Так что это не имеет отношения к POSIX-совместимым системам, таким как Linux, в которых мониторинг выводится через tail -fили less +Fявляется рутинным.
Chromatix
@ Chromatix Я действительно смущен конструктивной частью ваших рассуждений и не вижу, какие предложения или новую информацию вы предоставляете здесь, кроме вашей личной ненависти к Windows ... Вы не ответили на вопросы в моем комментарии вообще , Почему тебя волнует то, что я испытал? Пожалуйста, не переходите на личности.
Роланд Пихлакас
@RolandPihlakas Поскольку ваш ответ создает очень твердое впечатление, что открытие файла только для чтения опасно в Linux, хотя на самом деле это не так. На самом деле, всегда безопасно читать добавляемый файл, если вы не предполагаете, что «конец файла» означает «конец записи» или «конец строки». Единственный случай, когда это не удастся, - это когда приложение для записи содержит «обязательную блокировку», что делают очень немногие приложения (стандартная блокировка POSIX - «рекомендательная блокировка») и которая приведет к возникновению четко определенной ошибки, скорее чем ошибочное поведение.
Chromatix