Действительно ли возможно “прокрутить” символьную ссылку на новый файл, не влияя ни на какие открытые дескрипторы файлов?

Интерфейс системного журнала только позволяет фиксированный набор средств, определенных константами в /usr/include/sys/syslog.h. Единственное условие для пользовательских средств local0 через local7.

Что можно сделать для разделения, журналы различных серверов фильтры использования для соответствия на источнике или тексте каждого сообщения журнала. Rsyslog имеет довольно мощные фильтры (считайте свойства, доступные для соответствия).

7
01.04.2011, 17:35
6 ответов

Я не думаю, что это возможно, если Вы не можете заставить хвост закрывать и периодически вновь открыть файл. Один хвост (или любая другая программа) открывает файл, это получает дескриптор к inode того файла. В той точке больше не консультируются с именами файлов и ссылками. Именно поэтому можно удалить файл из файловой системы, и любая программа, которая имеет тот открытый файл, продолжит работать. Только когда; программа ast закрывает файл, что это на самом деле удалено из диска.

Обновление: По крайней мере, хвост версии на OS X имеет-F опцию, которая вновь откроет файл, если это переместилось.

7
27.01.2020, 20:16
  • 1
    Ubuntu имеет-F (или --follow=current.log - повторная попытка) также –  charlesbridge 01.04.2011, 21:39
  • 2
    tail -F также хорошо работает в Fedora; подсказка о OS X дала мне действительно подсказку для проверки его в моей системе. Это - лучший ответ при достижении, что я хочу сделать (продолжайте выслеживать файл, даже если это меняет имена); кажется довольно ясным, ответ на мой основной вопрос о символьных ссылках является "нет".Спасибо! –  matt b 01.04.2011, 23:19
  • 3
    F работает на меня в человечности. –  frankadelic 15.01.2013, 22:31

Если Вы находитесь на современном Linux, Вы могли бы использовать inotifywait, одна из программ командной строки от пакета inotify-инструментов. Я не сделал этого, но это похоже inotifywait мог использоваться в сценарии оболочки для сброса символьной ссылки и остановки и перезапуска tail -f на символьной ссылке. Вы могли бы даже смочь избавиться от символьной ссылки и просто выследить текущий файл журнала.

Не используя inotify, возможно записать Вашу собственную подобную хвосту программу, которая проверяет, чтобы видеть, изменилось ли inode количество имени файла, из которого это читает. В той точке может закрыться подобная хвосту программа, это - старый дескриптор файла, и получите новый дескриптор файла для теперь различного имени файла. Это - хитрая программа для записи, и это подвержено условиям состязания.

2
27.01.2020, 20:16

Из Вашего описания это кажется, что Ваше определенное обстоятельство могло быть решено путем создания задания крона, которое также уничтожило/перезапустило процесс хвоста. Но в целом, (Mac OS, являющийся исключением), хвост будет помнить, где Вы находитесь в файле (то есть, байтовое смещение). Кроме того, открытый дескриптор файла указывает на конечный файл, не символьную ссылку. Символьная ссылка становится не важной процессу считывания, после того как файл был открыт. Хотя возможно иметь функции, которые вновь открыли файл на основе первоначального тракта, когда что-то изменяется, большинство реализаций не делает этого.

1
27.01.2020, 20:16

Почему бы не зарегистрироваться в файл, current.log, который можно выследить-f к содержанию основ и затем использовать что-то как/usr/sbin/logrotate для вращения того файла. Можно указать в конфигурации, что требуется сделать, некоторые постповорачивают команды для переименования старого файла с добавленной датой и т.д. Это устраняет необходимость символьных ссылок полностью и может также упростить Ваш код входа.

Конечно, logrotate не может быть установлен в системе, для которой Вы разрабатываете.

1
27.01.2020, 20:16

После того как программа имеет открытый файл, это продолжает получать доступ к тому же самому файлу, даже если файл перемещен или даже удален. (Удаление открытого файла только удаляет свое имя; файл — inode — на самом деле удален, после того как никакой процесс не имеет его открытый.)

Некоторые программы смотрят, если что-то происходит с файлом, они имеют открытый. Например, классическая программа tail -f продолжает печатать строки, добавленные в тот же файл; некоторые современные реализации (GNU, FreeBSD, NetBSD, OSX) имеют tail -F, который обнаруживает, если новый файл с тем же именем перемещен в место и начинает читать из нового файла. Мультихвост может сделать это также (выполните его как multitail --retry).

Можно использовать интерфейс Inotify на Linux или его эквивалент на других нельдах, чтобы обнаружить, если файл изменился. На Linux используйте inotifywait команда.

1
27.01.2020, 20:16

Я предпочитаю использовать короткий сценарий жемчуга вместо /usr/bin/tail -f с этой целью.

См. http://search.cpan.org/~mgrabnar/File-Tail-0.99.3/Tail.pm для подсказок.

0
27.01.2020, 20:16

Теги

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