有人可以向我解释为什么这个脚本不删除 /var/logmessages 和 /var/log/wtmp 文件吗?我在 tldp.org 教程上找到了它
#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up"
exit
执行后,我检查了 /var/log 目录,消息和 wtmp 仍然存在于“旧”日志中。
为什么会发生这种情况?
答案1
如果您绝对必须清理日志文件,则必须以 sudo/root 身份执行此操作并重新启动 syslog 守护进程。 adm 组只允许您读取但不能写入(某些)日志文件。
请注意,在 Unix 系统中,文件仅在不再使用时放弃正在使用的空间/不再存在,因此需要重新启动 syslog,因为如果您要删除一个文件,用完所有日志分区,您将不会'没有看到空间被释放直到您重新启动 syslog 守护程序。同样,syslog 仍将向已“删除”的文件发送日志,而不是向使用 stdout 重定向 (">") 创建的新文件发送日志,直到您重新启动它为止。
关于wtmp和消息,让我们看看它们默认的权限:
$ls -la /var/log/messages /var/log/wtmp
-rw-r----- 1 root adm 818148 Apr 14 07:15 /var/log/messages
-rw-rw-r-- 1 root utmp 284928 Apr 14 07:37 wtmp
所以脚本应该是:
#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR
sudo cat /dev/null > messages
sudo cat /dev/null > wtmp
sudo service rsyslogd restart
echo "Logs cleaned up"
exit 0
最终,syslog 守护进程还会(重新)创建具有正确权限的 /var/log/messages 文件,所以实际上我更愿意这样做:
#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR
sudo rm messages
sudo sh -c 'cat /dev/null > wtmp'
sudo service rsyslogd restart
echo "Logs cleaned up"
exit 0
警告:小心您运行的脚本。您不应在生产系统中覆盖 /var/log/wtmp。您想要拥有登录用户的历史记录。