%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%20%D0%B2%D1%85%D0%BE%D0%B4%D0%B0%20%D0%B2%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%83.png)
Я использую почтовый сервер, к которому подключаюсь с помощью SSH. Мой .bash_profile
настроен на присоединение сеанса SSH к определенному screen
сеансу.
Теперь я хотел бы, чтобы журнал (например, syslog) был напечатан в одном окне этого сеанса экрана. Я попробовал запустить
tail -f /var/log/syslog
но вывод останавливается каждый день в 6:25. Я думаю, что это время, когда журнал ротируется. Так есть ли способ распечатать журнал так, чтобы экран?
решение1
Тебе нужноtail --follow=name /var/log/syslog
Причина в том, что по умолчанию — якобы из соображений производительности — tail
открывается указанный файл, а затем отслеживаетсядескриптор файлаон получает из этого open(2)
вызова для изменений. Это работает нормально, пока файл изменяется — добавляется или даже перезаписывается (сначала обрезая его), но это перестает работать, если файлзаменены— то есть удаляется и создается с тем же именем, и именно так logrotate
обычно и происходит.
Режим «имя» --follow
использует tail
более затратный stat(2)
системный вызов, который фактически «разрешает» имя файла каждый раз через уровень файловой системы, и если tail
замечает, что файл изменил свое так называемое"инод", tail
повторно открывает файл.
Вывод из man tail
:
-f, --follow[={name|descriptor}]
выводить добавленные данные по мере роста файла; отсутствующий аргумент опции означает «дескриптор»
Вы также можете взглянуть на -F
параметр командной строки, который определяется как
-F
такой же как--follow=name --retry
решение2
Ваша догадка на самом деле верна. В это время syslog прерывает запись в журнал, делает gz из него и перезапускает журнал.
Вы можете попробовать с
tail -f --retry /var/log/syslog
Таким образом, tail должен повторить попытку открытия файла после завершения ротации журнала.