Wie kann ich über die Befehlszeile überprüfen, ob ein Neustart unter RHEL oder CentOS erforderlich ist?

40

Ich verwende CentOS und Red Hat Enterprise Linux auf einigen Computern ohne GUI. Wie kann ich überprüfen, ob kürzlich installierte Updates einen Neustart erfordern? In Ubuntu bin ich es gewohnt, zu überprüfen, ob /var/run/reboot-requiredvorhanden ist.

Jim Hunziker
quelle

Antworten:

34

https://access.redhat.com/discussions/3106621#comment-1196821

Vergessen Sie nicht, dass Sie aufgrund von Aktualisierungen der Kernbibliothek möglicherweise einen Neustart durchführen müssen, zumindest wenn es sich um glibc handelt. (Außerdem müssen Dienste nach Updates möglicherweise neu gestartet werden.)

Wenn Sie das yum-utilsPaket installieren , können Sie einen Befehl mit dem Namen verwenden needs-restarting.

Sie können beide verwenden, um zu überprüfen, ob ein vollständiger Neustart aufgrund von Kernel- oder Kernbibliotheksaktualisierungen erforderlich ist (mithilfe der -rOption) oder welche Dienste neu gestartet werden müssen (mithilfe der -sOption).

needs-restarting -rGibt zurück, 0wenn kein Neustart erforderlich ist, und 1wenn dies der Fall ist, ist es perfekt für die Verwendung in einem Skript.

Ein Beispiel:

root@server1:~> needs-restarting  -r ; echo $?
Core libraries or services have been updated:
  openssl-libs -> 1:1.0.1e-60.el7_3.1
  systemd -> 219-30.el7_3.9

Reboot is required to ensure that your system benefits from these updates.

More information:
https://access.redhat.com/solutions/27943
1
xddsg
quelle
1
Es ist erwähnenswert, dass mindestens die -sOption root-Zugriff erfordert.
Paul Gear
2
Für Fedora needs-restartingist ein DNF-Plugin . Es unterstützt -roder -s(noch) nicht.
Franklin Yu
30

Informationen zum Vergleichen installierter und laufender Kernel:

#!/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

Hoffentlich hilft das!

alexm
quelle
2
Zuerst dachte ich, dass dies nicht funktioniert, da ich nach dem Neustart weiterhin aufgefordert wurde, neu zu starten. Dann stellte ich fest, dass Sie bei Verwendung einer DigitalOcean-Instanz den Kernel vor dem Neustart manuell über das Control Panel ändern müssen.
Programster
Gibt es einen Grund, warum die kernel-Zeichenfolge aus der Ausgabe von entfernt wird rpm -q?
Zlemini
1
Die kernel-Zeichenfolge muss entfernt werden, um sie mit der Ausgabe von zu vergleichen uname -r, die sie nicht enthält.
Alexm
7

Sie können die Ausgabe von uname -a mit der Liste der installierten Kernelpakete vergleichen

Dominik
quelle
2
Ist ein anderer Kernel der einzige Grund , ein Linux - Server würde benötigen einen Neustart?
Chris_K
1
Normalerweise sollte es nicht viele andere Gründe geben, das System neu zu starten, außer dem Kernel-Upgrade
Dominik
Ich vermute , dass einige andere Pakete können einen Neustart eben iof Kernel erfordert nicht ändern (wenn ich kexec-tools-2.0.0-258 auf centos6.0 installiert gab es keinen Speicher für den Dump reserviert)
nhed
Das pbis-open-Paket von BeyondTrust fordert den Benutzer auf, nach der Installation über stdout einen Neustart durchzuführen.
bshacklett
6

uname -avs. rpm -q kernelund needs-restartingausyum-utils

ptman
quelle
5

Es kann hilfreich sein, zu überprüfen, ob Dateien vorhanden sind, die durch das Update entfernt / ersetzt wurden, für die aber die alten Dateien noch von aktiven Prozessen geladen / verwendet werden.

Wenn YUM eine Datei aktualisiert, die von einem Prozess verwendet wird, wurde die Datei möglicherweise zum Löschen markiert. Der Prozess verwendet jedoch weiterhin die alte Datei, da sie einen offenen Dateideskriptor für den Inode der alten Datei enthält.

Ein Befehl, um die Anzahl der noch verwendeten alten Dateien zu ermitteln:

#lsof | grep "(path inode=.*)" | wc -l

Dieser Befehl zählt die Dateien.

Verwenden Sie stattdessen diese Option, um festzustellen, welche Dateien tatsächlich verwendet werden:

#lsof | grep "(path inode=.*)"

Dieser Befehl erzeugt auf einer mit YUM aktualisierten Box eine Ausgabe ähnlich der folgenden:

COMMAND    PID   USER   FD      TYPE DEVICE SIZE/OFF   NODE NAME
sshd      3782   root  mem       REG   8,17          153427 /lib64/libcrypto.so.0.9.8e (path inode=153253)
mysqld    3883  mysql  mem       REG   8,17          153259 /lib64/libcrypt-2.5.so (path inode=153402)
mingetty  4107   root  mem       REG   8,17          153243 /lib64/libc-2.5.so (path inode=153222)
...
etc
GrangerX
quelle
2

Überprüfen Sie, ob der laufende Kernel der neueste ist.

Ist dies nicht der Fall, überprüfen Sie, ob das System seit der Kernel-Installation neu gestartet wurde.

Wenn nicht, starten Sie neu.

CURRENT_KERNEL="$(rpm -q kernel-$(uname -r))"
test -z "$CURRENT_KERNEL" && exit 0     # Current kernel is a custom kernel

LATEST_KERNEL="$(rpm -q kernel | tail -1)"
test -z "$LATEST_KERNEL" && exit 0      # No kernel package installed

LATEST_KERNEL_INSTALLTIME=$(rpm -q kernel --qf "%{INSTALLTIME}\n" | tail -1)
test -z "$LATEST_KERNEL_INSTALLTIME" && exit 1      # Error reading INSTALLTIME

test "$CURRENT_KERNEL" = "$LATEST_KERNEL" && exit 0 # Latest kernel running, no reboot needed

BOOTTIME="$(sed -n '/^btime /s///p' /proc/stat)"
test -z "$BOOTTIME" && exit 1           # Error reading BOOTTIME

test "$LATEST_KERNEL_INSTALLTIME" -lt "$BOOTTIME" && exit 1 # Latest kernel not running, but system was restarted already
                                        # User switched back to an old kernel?

echo reboot
Nicolas Melay
quelle
Dies funktioniert nicht, wenn Sie eine PAE-fähige Kernelversion haben. Der Befehl uname -r gibt das PAE-Suffix nach dem Teil .elX zurück, jedoch nicht die RPM-Namen.
Yanick Girouard
1

Ich weiß, dass diese Frage bereits beantwortet wurde und dass die Leute Informationen zur Überprüfung auf neuere Kernel sowie gelöschte Dateien veröffentlicht haben, aber ich habe kürzlich ein Skript geschrieben, das beide überprüft. Wenn eine der beiden Bedingungen erkannt wird, ist ein Neustart für +30 Minuten geplant.

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

NEW_KERN=0
DEAD_FILES=0

die () {
    printf "Error, exiting: "
    echo $@
    exit 1
}

for X in lsof wc column awk rpm sed head uname dd tr cut date logger shutdown; do
    which "${X}" >/dev/null 2>&1 || die "required application ${X} not found"
done

DATEY="$(date +%Y%m%d-%H%M%S)"
TMPFILE=/tmp/"$(dd if=/dev/urandom bs=1 count=256 2>/dev/null |tr -c -d '0-9a-f' |cut -c-7)"

[ $TMPFILE == "/tmp/" ] && die
echo "### Reboot automation notice: ${DATEY} ###" > "${TMPFILE}"
lsof +c0 -d DEL | grep -v '\s/SYSV' |awk 'NR==1 || !/dev\/zero/ {print $2,$1,$4,$NF}' | column -t >> "${TMPFILE}"

if [ $(cat ${TMPFILE} |wc -l) -gt 2 ]; then
    DEAD_FILES=1
else
    echo "### Reboot automation notice: ${DATEY} ###" > "${TMPFILE}"
fi

C_KERN="kernel-$(uname -r)"
A_KERN="$(rpm -q --last kernel |head -1 |sed 's|\s\+.*$||')"

[ $A_KERN != $C_KERN ] && NEW_KERN=1 && printf "Running $C_KERN, but $A_KERN available\n" >> "${TMPFILE}"

echo "### End of reboot automation notice: ${DATEY} ###" >> "${TMPFILE}"
if [[ $DEAD_FILES -eq 0 && $NEW_KERN -eq 0 ]]; then
    echo reboot not required
else
    logger -t rebooter -p auth.warning -f "${TMPFILE}"
    [ $DEAD_FILES -ne 0 ] && echo "   Processes running with broken links to executables,"
    [ $NEW_KERN -ne 0 ] && echo "   New kernel available,"
    echo Reboot is required
    shutdown -r +30 "System reboot is required.  To cancel use shutdown -c.  But don't because this system needs to be rebooted"
fi

[ -f "${TMPFILE}" ] && rm -f "${TMPFILE}"
Liczyrzepa
quelle
1

Hier ist meine Version des Alexm-Codes. Du kannst das:

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

 if [ $LAST_KERNEL != $CURRENT_KERNEL ]
 then 
    echo "It is time to Reboot!"
 else 
    echo "There is nothing to do!"
 fi
Sandmann
quelle
-5

install.log install.log.syslog yum.log Sie überprüfen diesen Ort, was alle neuen RPMs installiert haben

Rajat
quelle