adm默认组被删除,导致 logrotate 工作失败

本文目录 隐藏 1 排查与恢复 2 手工执行一次轮转 3 转轮后,混了月份的nginx日志清理 3.1 从轮转…

排查与恢复

/etc/logrotate.conf 第10行默认配置为 su roo adm,配置行的意思是:logrotate 在切换(rotate)日志时,会以 root 用户身份操作,并将新创建的日志文件所属组设为 adm。

# -d 只是验证,不做实际运行。
$ sudo logrotate -d /etc/logrotate.conf
error: /etc/logrotate.conf:10 unknown group 'adm'  
$ grep "adm" /etc/group
admin:x:104:

$ sudo groupadd adm
$ sudo gpasswd -a $USER adm
$ grep "adm" /etc/group
admin:x:104:
adm:x:1008:xxx
# 在aliyun为 adm:x:4:syslog,$USER

手工执行一次轮转

# 只对单个应用
sudo logrotate /etc/logrotate.d/nginx

# 对所有应用
sudo logrotate /etc/logrotate.conf

转轮后,混了月份的nginx日志清理

通过vim :? 查出日志月份分割行号,以下示例为:第1行到第37809行是上月,第37810行及之后是当月的。

从轮转后的日志文件中,将当月日志内容行,插入到当前日志文件中

# 提取从第37810行及之后的内容:
sudo tail -n +37810 access_blog.t725.cn.log.202604 >> access_blog.t725.cn.log

tail是sudo执行,但>>是由当前用户来执行;直接执行会提示 -bash: access_blog.t725.cn.log: Permission denied

方案一:tee 命令可以接收标准输出并将其写入文件,配合 sudo 可以解决权限问题。-a 参数表示追加(append)

sudo tail -n +37810 access_blog.t725.cn.log.202604 | sudo tee -a access_blog.t725.cn.log > /dev/null

方案二:使用 sh/bash -c 启动一个新的shell,执行完成后退出。

sudo sh -c "tail -n +37810 access_blog.t725.cn.log.202604 >> access_blog.t725.cn.log"

操作完成后建议执行 sudo systemctl reload nginx,确保 Nginx 识别到文件大小的变化(虽然追加操作通常不会导致问题,但这是个好习惯)。

从轮转后的日志文件中,移除当月日志内容行

sudo sed -i '37810,$d' access_blog.t725.cn.log.202604

注意:sed -i 实际上是创建了一个新文件并覆盖原文件。如果 Nginx 正在写这个文件,它会继续往已经“从磁盘删除”的旧文件里写,导致你看不到新日志,直到重启 Nginx。

sed 其他操作写法

# 提取前 37809 行:
sudo sed -n '1,37809p' access_blog.t725.cn.log >> access_blog.t725.cn.log.202604
head -n 37809 access_blog.t725.cn.log >> access_blog.t725.cn.log.202604

# 删除原文件中的前 37809 行:
sed -i '1,37809d' access_blog.t725.cn.log
# 删除从第 37810 行到最后一行 ($) 的内容
sed -i '37810,$d' access_blog.t725.cn.log.202604

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注