Ротация системного журнала не работает
У меня есть VPS на сервере Ubuntu (9.04/Jaunty), который неправильно вращает системные журналы.
Вот что я проверил до сих пор:
- syslogd-listfiles перечисляет файлы, которые я думаю должен быть повернут
- cron.daily работает (так говорит системный журнал)
- когда я вручную запускаю проверку файлов в начале /etc/cron.daily/sysklogd, они все проходят (
test -x /usr/sbin/syslogd-listfiles
,test -x /sbin/syslogd
,test -f /usr/share/sysklogd/dummy
) - когда я запускаю задание cron.daily вручную от имени пользователя root (
sudo run-parts --verbose /etc/cron.daily
) логи вращаются, как я и ожидал
У кого-нибудь есть идеи, что я мог бы попробовать дальше или что мне не хватает? Я думал, что, возможно, тот факт, что sysklogd, кажется, запускает свой процесс как syslog (владелец syslogd в ps -C syslogd -o user= | head -n 1
) означает, что существует какая-то проблема с разрешениями, и это, кажется, подтверждается результатами выполнения sudo -u syslog run-parts --verbose /etc/cron.daily
что в итоге приводит к ошибкам в разрешениях, но я не уверен, что будет лучшим решением для этого.
Содержимое моего файла sysklogd следует на случай, если это поможет. touch /etc/crontouchtest
бит это то, что я вставил, чтобы проверить, когда файл успешно запущен. Обновляет время последнего использования (ls -lut /etc/crontouchtest
) когда я выполняю run-parts от имени root, но не когда cron.daily запускается.
#! /bin/sh
# sysklogd Cron script to rotate system log files daily.
#
# If you want to rotate other logfiles daily, edit
# this script. An easy way is to add files manually,
# to add -a (for all log files) to syslogd-listfiles and
# add some grep stuff, or use the -s pattern argument to
# specify files that must not be listed.
#
# This is a configration file. You are invited to edit
# it and maintain it on your own. You'll have to do
# that if you don't like the default policy
# wrt. rotating logfiles (i.e. with large logfiles
# weekly and daily rotation may interfere). If you edit
# this file and don't let dpkg upgrade it, you have full
# control over it. Please read the manpage to
# syslogd-listfiles.
#
# Written by Martin Schulze <joey@debian.org>.
# $Id: cron.daily,v 1.14 2007-05-28 16:33:34 joey Exp $
test -x /usr/sbin/syslogd-listfiles || exit 0
test -x /sbin/syslogd || exit 0
test -f /usr/share/sysklogd/dummy || exit 0
touch /etc/crontouchtest
USER=$(ps -C syslogd -o user= | head -n 1)
[ -z "${USER}" ] && USER="root" || true
set -e
cd /var/log
logs=$(syslogd-listfiles)
test -n "$logs" || exit 0
for LOG in $logs
do
if [ -s $LOG ]; then
savelog -g adm -m 640 -u ${USER} -c 7 $LOG >/dev/null
fi
done
# Restart syslogd
#
/etc/init.d/sysklogd reload-or-restart > /dev/null
РЕДАКТИРОВАТЬ
Выходы в соответствии с просьбой:
ls -la /etc/cron.daily (run as root)
drwxr-xr-x 2 root root 4096 Oct 23 07:13 .
drwxr-xr-x 107 root root 4096 Oct 23 07:14 ..
-rwxr-xr-x 1 root root 314 Feb 10 2009 aptitude
-rwxr-xr-x 1 root root 111 May 11 11:49 backup-manager
-rwxr-xr-x 1 root root 89 Jan 26 2009 logrotate
-rwxr-xr-x 1 root root 1334 Oct 22 09:35 sysklogd
ps -ef | egrep '[c]ron' (run as root)
root 13369 1 0 Oct21 ? 00:00:02 /usr/sbin/cron
РЕДАКТИРОВАТЬ 2
Соответствующие пути
от echo $PATH
(после перехода в корень):
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
от /etc/crontab
:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
2 ответа
Отвечая на этот вопрос, чтобы решение было легче найти.
Задание по умолчанию sysklogd cron сначала проверяет наличие anacron, и, если оно найдено, не запускает ротацию журналов для системных журналов. Как предложил @Steven, я удалил anacron из системы (поскольку он является сервером и должен работать 24/7/365, функции anacron на самом деле не нужны). Как только anacron был отключен от системы, тест anacron в задании cron завершается неудачно, и ротация системного журнала работает как чемпион.
Спасибо @Steven
Бит touch /etc/crontouchtest - это то, что я вставил, чтобы проверить успешность запуска файла. Он обновляет время, использованное в последний раз (ls -lut / etc / crontouchtest), когда я выполняю run-parts от имени пользователя root, но не при запуске cron.daily.
Если я правильно прочитал, /etc/crontouchtest
не обновляется, когда cron
запускает задачи cron.daily. Это в сочетании с тем, что /etc/cron.daily/sysklogd
работает правильно при запуске вручную, заставляет меня подозревать, что что-то вызывает run-parts
не запустить /etc/cron.daily/sysklogd
когда run-parts
управляется cron
,
поскольку cron
выполняется с правами root, и ваш ручной тест также выполнялся с правами root, между этими двумя средами разница очень мала. Все, что я могу думать о том, что cron
возможно, работает с другим PATH по сравнению с PATH, который существует в командной строке. Кроме того, когда процесс выполняется cron
нет управления tty. Может ли любое из этих различий объяснить разницу в результатах?