Logrotate postrotate脚本无法向Podman容器发送SIGHUP致日志轮转异常
核心问题
宿主机执行logrotate轮转容器rsyslog写入的挂载日志时,logrotate异常退出(返回码1),轮转后的文件生成正常,但rsyslog未切换到新文件写入;手动执行postrotate中的podman exec命令有效,但logrotate中执行无效果,调试日志为空,dry run无报错。
排查与修复步骤
修正输出重定向顺序,捕获完整错误日志
当前重定向写法2>&1 > /tmp/postrotate.log会导致stderr被重定向到logrotate的默认输出而非文件,无法捕获真实错误。修改为:postrotate /bin/podman exec rsyslog-f5 /usr/bin/killall -HUP rsyslogd > /tmp/postrotate.log 2>&1 || false endscript这样stdout和stderr都会写入日志文件,能看到具体执行错误。
解决logrotate运行环境与交互式环境的差异
logrotate通常通过systemd timer运行,其环境变量可能缺少podman所需的配置(比如XDG_RUNTIME_DIR)。可以在命令中显式指定podman socket路径:postrotate /bin/podman --socket=/run/podman/podman.sock exec rsyslog-f5 /usr/bin/killall -HUP rsyslogd > /tmp/postrotate.log 2>&1 || false endscript也可以在logrotate的systemd service文件中添加必要环境变量,确保podman能正常连接容器。
替换killall为精准的PID定位命令
容器内killall可能因进程名匹配或权限问题执行失败,改用直接定位rsyslogd PID的方式:postrotate /bin/podman exec rsyslog-f5 /bin/kill -HUP $(/bin/podman exec rsyslog-f5 /usr/bin/pidof rsyslogd) > /tmp/postrotate.log 2>&1 || false endscript这种方式更可靠,避免killall的潜在问题。
查看logrotate的完整运行日志
除了alert信息,通过以下命令获取更详细的执行日志:journalctl -u logrotate.service或者检查
/var/log/messages,里面可能包含logrotate执行时的具体错误细节。验证容器内命令的绝对路径可用性
确认容器内killall、pidof、kill等命令的绝对路径正确,避免logrotate运行时容器内PATH环境变量缺失导致命令找不到。
内容的提问来源于stack exchange,提问作者v05

