Automatic reboots after Linux patches

Vor kurzen habe ich mich in einem Projekt um die Automatisierung von Linux Patches gekümmert. Nach einem Upgrade ist bekanntlich je nach Art der installierten Updates eventuell ein Restart von bestimmten Diensten oder sogar ein kompletter Reboot notwendig. Der Kunde wollte den Reboot nicht pauschalisieren und hatte dafür bereits eine Lösung parat. Folgenden Codeschnipsel habe ich vorgefunden.

#!/bin/bash
LAST_KERNEL=$(rpm -q --last kernel | perl -pe 's/^kernel-(\S+).*/$1/' | head -1)
CURRENT_KERNEL=$(uname -r)

test $LAST_KERNEL = $CURRENT_KERNEL || echo REBOOT

Kurz gesagt wird einfach geprüft ob das laufende System dem zuletzt installierten Kernel entspricht. Das mag zwar funktionieren, lässt aber viele Aspekte außer Acht. Ein Reboot macht nicht nur beim Update des Kernels, sondern zum Beispiel auch bei der Aktualisierung von Core Libraries (wie etwa glibc) Sinn. Dazu kommen weitere Pakete, die dann schon einiges mehr an Logik im Update Script benötigen.

Zum Glück ist das ganze aber kein neues Thema und wurde schon oftmals von anderen Leuten gelöst. Sowohl für Enterprise Linux als auch für Debian basierte Systeme gibt es jeweils eine sehr schöne und einfache, fertige Lösung.

Enterprise Linux
Für EL basierte Systeme (CentOS, RedHat) heißt der nötige Befehl needs-restarting und wird über das Paket yum-utils (ohnehin auf jedem System sinnvoll) ausgeliefert.

-bash# needs-restarting -r || shutdown -r

Eine erweiterte Möglichkeit bietet auch das YUM Plugin „ps“.

-bash# yum ps
Geladene Plugins: etckeeper, fastestmirror, ps
       pid proc                  CPU      RSS      State uptime
Loading mirror speeds from cached hostfile
 * base: mirror.checkdomain.de
 * epel: mirror.wiuwiu.de
 * extras: mirror.checkdomain.de
 * updates: mirror.checkdomain.de
kernel-3.10.0-862.6.3.el7.x86_64  
         0 <kernel>             0:00      0 B    Running: *4 day(s) 8:55:06

Dieses Plugin bricht das ganze auch auf einzelne Dienste herunter. Sofern also kein Reboot sondern nur ein Neustart eines bestimmten Dienstes notwendig sein sollte kann man das hiermit ebenfalls auslesen.

Debian
Für Debian und Ubuntu heißt das nötige Tool reboot-notifier und sollte meiner Meinung nach ebenfalls auf jedem System installiert sein. Sofern ein Reboot benötigt wird wird durch einen APT Hook das File /var/run/reboot-required angelegt.

[ -f /var/run/reboot-required ] && shutdown -r

Eine erweiterte Möglichkeit bietet checkrestart aus dem Paket debian-goodies.

-bash# checkrestart 
Found 25 processes using old versions of upgraded files
(16 distinct programs)
(11 distinct packages)

Of these, 10 seem to contain systemd service definitions or init scripts which can be used to restart them.
The following packages seem to have definitions that could be used
to restart their services:
uuid-runtime:
	1060	/usr/sbin/uuidd
irqbalance:
	1351	/usr/sbin/irqbalance
accountsservice:
	1382	/usr/lib/accountsservice/accounts-daemon
rsyslog:
	1408	/usr/sbin/rsyslogd
policykit-1:
	1515	/usr/lib/policykit-1/polkitd
openssh-server:
	2068	/usr/sbin/sshd
puppet:
	2546	/usr/bin/puppet
nagios-nrpe-server:
	4590	/usr/sbin/nrpe
ntp:
	4791	/usr/sbin/ntpd
fail2ban:
	5441	/usr/bin/fail2ban-server

These are the systemd services:
systemctl restart accounts-daemon.service
systemctl restart polkit.service

These are the initd scripts:
service uuidd restart
service irqbalance restart
service rsyslog restart
service ssh restart
service puppet restart
service nagios-nrpe-server restart
service ntp restart
service fail2ban restart

These processes (1) do not seem to have an associated init script to restart them:
qemu-system-x86:
	597	/usr/bin/qemu-system-x86_64
	6742	/usr/bin/qemu-system-x86_64
	6822	/usr/bin/qemu-system-x86_64
	6938	/usr/bin/qemu-system-x86_64
	26613	/usr/bin/qemu-system-x86_64
	26948	/usr/bin/qemu-system-x86_64
	31880	/usr/bin/qemu-system-x86_64
	32553	/usr/bin/qemu-system-x86_64
	32632	/usr/bin/qemu-system-x86_64

Einen Kommentar hinterlassen

Dein Kommentar