Comment puis-je vérifier à partir de la ligne de commande si un redémarrage est requis sous RHEL ou CentOS?

40

J'utilise CentOS et Red Hat Enterprise Linux sur quelques machines sans interface graphique. Comment puis-je vérifier si les mises à jour récemment installées nécessitent un redémarrage? Dans Ubuntu, je suis habitué à vérifier si /var/run/reboot-requiredest présent.

Jim Hunziker
la source

Réponses:

34

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

N'oubliez pas que vous devrez peut-être redémarrer à cause des mises à jour de la bibliothèque principale, du moins s'il s'agit de glibc. (Et aussi, il faudra peut-être redémarrer les services après les mises à jour).

Si vous installez le yum-utilspackage, vous pouvez utiliser une commande appelée needs-restarting.

Vous pouvez l'utiliser à la fois pour vérifier si un redémarrage complet est requis à cause des mises à jour des bibliothèques du noyau ou du noyau (à l'aide de l' -roption), ou quels services doivent être redémarrés (à l'aide de l' -soption).

needs-restarting -rretourne 0si le redémarrage n'est pas nécessaire, et 1si c'est le cas, il est donc parfait à utiliser dans un script.

Un exemple:

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
la source
1
Il convient de noter qu'au moins l' -soption nécessite un accès root.
Paul Gear
2
Pour Fedora, needs-restartingest un plugin DNF . Il ne supporte pas -rou -s(encore).
Franklin Yu
30

A propos de la comparaison des noyaux installés avec ceux en cours d’exécution:

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

J'espère que ça t'as aidé!

alexm
la source
2
Au début, je pensais que cela ne fonctionnait pas, car il continuait de me demander de redémarrer après, mais j'ai ensuite découvert que si vous utilisez une instance de DigitalOcean, vous devez d'abord modifier manuellement le noyau à partir de son panneau de configuration avant de redémarrer.
Programme du
Y a-t-il une raison pour laquelle la kernel-chaîne est supprimée de la sortie de rpm -q?
Zlemini
1
La kernel-chaîne doit être supprimée pour la comparer à la sortie uname -rqui ne la contient pas.
alexm
7

Vous pouvez comparer la sortie de uname -a à la liste des paquets du noyau installés.

Dominik
la source
2
Un noyau différent est-il la seule raison pour laquelle un serveur Linux aurait besoin d' un redémarrage?
Chris_K
1
Normalement, lorsque vous restez dans les processus «normaux» de mise à niveau du paquet (mise à jour, date de publication, etc.), il ne devrait pas y avoir beaucoup plus de raisons de redémarrer le système que la mise à niveau du noyau
Dominik
Je soupçonne que certains autres paquets peuvent nécessiter un redémarrage. Le noyau ne change pas (quand j'ai installé kexec-tools-2.0.0-258 sur centos6.0, aucune mémoire n'était réservée pour le dump)
notifié
Le paquet pbis-open de BeyondTrust demande à l'utilisateur de redémarrer après l'installation via stdout.
bshacklett
6

uname -apar rapport à rpm -q kernelet needs-restartingdeyum-utils

ptman
la source
5

Une chose qui peut être utile à considérer en termes de "est un redémarrage requis" est de savoir si des fichiers ont été supprimés / remplacés par la mise à jour mais pour lesquels les anciens fichiers sont toujours chargés / utilisés par les processus actifs.

Fondamentalement, lorsque YUM met à jour un fichier en cours d'utilisation par un processus, le fichier lui-même peut avoir été marqué pour suppression, mais le processus continue à utiliser l'ancien fichier car il possède un descripteur de fichier ouvert correspondant à son inode.

Une commande permettant de compter le nombre d'anciens fichiers encore utilisés:

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

Cette commande vous donnera un décompte des fichiers.

Utilisez plutôt ceci pour voir quels fichiers sont réellement utilisés:

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

Cette commande produira une sortie similaire à celle-ci sur une boîte mise à jour par YUM:

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
la source
2

Vérifiez si l'exécution du noyau est la dernière.

Si ce n'est pas le cas, vérifiez si le système a été redémarré depuis l'installation du noyau.

Si ce n'était pas le cas, redémarrez.

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
la source
Cela ne fonctionne pas si vous avez une version du noyau compatible PAE. L'uname -r comamnd renvoie le suffixe PAE après la partie .elX mais pas les noms rpm.
Yanick Girouard
1

Je sais que cette question a déjà reçu une réponse et que les gens ont posté des informations sur la vérification des nouveaux noyaux ainsi que des fichiers supprimés, mais j'ai récemment écrit un script qui vérifie les deux. Si l'une ou l'autre des conditions est détectée, le redémarrage est planifié pour +30 minutes.

#!/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
la source
1

Voici ma version du code alexm. Tu peux le faire:

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
marchand de sable
la source
-5

install.log install.log.syslog yum.log vous vérifiez à cet endroit ce qui est arrivé tout nouveau rpm a été installé

Rajat
la source