Ротация системного журнала не работает

У меня есть 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. Может ли любое из этих различий объяснить разницу в результатах?

Другие вопросы по тегам