系统日志轮换不起作用

系统日志轮换不起作用

我有一个 Ubuntu(9.04/Jaunty)服务器 VPS,它不能正确轮换系统日志。

以下是我目前检查过的内容:

  • syslogd-listfiles 列出我认为应该轮换的文件
  • cron.daily 正在运行(系统日志也是如此)
  • 当我手动运行 /etc/cron.daily/sysklogd 开头的文件检查时,它们都通过了(test -x /usr/sbin/syslogd-listfiles,,)test -x /sbin/syslogdtest -f /usr/share/sysklogd/dummy
  • 当我以 root 身份手动运行 cron.daily 作业时(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当我以 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 <[email protected]>.
#               $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(切换到 root 之后):

/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

答案1

我插入了 touch /etc/crontouchtest 位来验证文件是否成功运行。当我以 root 身份执行运行部分时,它会更新上次使用时间 (ls -lut /etc/crontouchtest),但 cron.daily 运行时不会更新。

如果我没看错的话,/etc/crontouchtest在运行 cron.daily 任务时不会更新cron。再加上/etc/cron.daily/sysklogd手动启动时可以正确运行的事实,让我怀疑在手动启动时有某种原因导致run-parts无法启动。/etc/cron.daily/sysklogdrun-partscron

由于cron是以 root 身份运行的,并且您的手动测试也是以 root 身份运行的,因此这两个环境之间几乎没有区别。我能想到的只是,cron与命令行中存在的 PATH 相比,它运行的 PATH 可能不同。此外,当进程由 运行时cron,没有控制 tty。这些差异中的任何一个可以解释结果的差异吗?

答案2

回答这个问题以便更容易找到解决方案。

默认的 sysklogd cron 作业首先检查 anacron,如果发现则不运行系统日志的日志轮换。正如 @Steven 所建议的,我从系统中删除了 anacron(因为它是一台服务器,并且打算 24/7/365 全天候运行,所以 anacron 的功能实际上并不需要)。一旦 anacron 从系统中退出,cron 作业中的 anacron 测试就会失败,系统日志轮换就会像冠军一样工作。

谢谢@Steven

相关内容