Wenn logrotate
alte Logdateien rotiert, muss rsyslog seine Dateihandles neu öffnen, sonst schreibt es weiter in die alten (nun rotierten) Files, was zum Problem mit offenen Dateihandles führt.
Doch mit welchem postrotate
Aufruf macht man das am besten? Im laufe der Zeit hat es einige Varianten gegeben.
Inhalt
Die alte Variante: PID HUP
Früher hatte man das mit PID Dateien gemacht:
postrotate
/bin/kill -HUP $(cat /var/run/rsyslogd.pid 2>/dev/null) 2>/dev/null || true
endscript
doch diese Methode ist unbeständig (die PID Datei könnte je nach Distribution an einem anderen Ort liegen) und sollte daher nicht mehr gemacht werden
Die moderne Variante: systemctl HUP
Das Senden des Signals HUP
an den Dienst ist die empfohlene Methode, um rsyslog seine Logfiles neu einlesen zu lassen, ohne kompletten Restart.
Das sollte so aussehen (z. B. in /etc/logrotate.d/rsyslog
):
postrotate
/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
endscript
Die Red Hat Variante: /usr/lib/rsyslog/rsyslog-rotate
Auf Red Hat Systemen (RHEL, AlmaLinux, RockyLinux) findet man den Aufruf:
postrotate
[ -x /usr/lib/rsyslog/rsyslog-rotate ] && /usr/lib/rsyslog/rsyslog-rotate || true
endscript
Das Skript ist ein Wrapper, der genau das erledigt, was mit systemctl kill -s HUP rsyslog.service
gemacht würde.
#!/bin/sh
# Rotate rsyslog logs safely
if systemctl >/dev/null 2>&1; then
systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
else
kill -HUP $(cat /var/run/rsyslogd.pid 2>/dev/null) 2>/dev/null || true
fi
und es funktioniert auch nur auf Red Hat Systemen, weil z.B. auf Debian Systemen dieses Wrapper-Script nicht vorhanden ist.
Daher ist die direkte Variante besser, sie ist distributionssicher und versionsunabhängig.
Im seltenen Fall wo man es mit Systemen zu tun hat, die noch kein rsyslog haben, kann man dieses Rapper-Script jedoch nutzen.