Я использую почтовый сервер, к которому я подключаюсь по SSH. Мой .bash_profile настроен для привязки сеанса SSH к определенному screen сеансу.

Теперь я хотел бы, чтобы журнал (например, системный журнал) печатался в одном окне этого сеанса экрана. Я пробовал бегать

tail -f /var/log/syslog

но выходной останавливается каждый день в 6:25. Я думаю, что это время, когда журнал вращается. Так есть ли способ распечатать журнал на экране?

2 ответа2

1

Вам нужен tail --follow=name /var/log/syslog

Причина в том, что по умолчанию - предположительно из соображений производительности - tail открывает указанный файл и затем просматривает дескриптор файла, полученный из этого вызова open(2) для внесения изменений. Это работает нормально до тех пор, пока файл изменяется - добавляется или даже переписывается (сначала обрезая его), но перестает работать, если файл заменяется - то есть удаляется и создается с тем же именем, и это обычно делает logrotate .

Режим "name" --follow заставляет tail использовать более дорогой системный вызов stat(2) который фактически "разрешает" имя файла каждый раз через слой файловой системы, и если tail замечает, что файл изменил свой так называемый "inode", tail повторно открывает файл.

Выход из man tail:

-f, --follow[={name|descriptor}]

выводить добавленные данные по мере роста файла; аргумент отсутствия опции означает «дескриптор»

Вы также можете посмотреть опцию командной строки -F , которая определяется как

-F же, как --follow=name --retry

0

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

Вы можете попробовать с

tail -f --retry /var/log/syslog

Таким образом, tail должен повторить попытку открытия файла, когда ротация журнала будет выполнена

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .