web-dev-qa-db-fra.com

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

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, j'ai l'habitude de vérifier si /var/run/reboot-required est présent.

47
Jim Hunziker

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

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

Si vous installez le yum-utils package, 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 en raison des mises à jour du noyau ou des bibliothèques de base (en utilisant le -r), ou quels services doivent être redémarrés (à l'aide de -s option).

needs-restarting -r Retour 0 si le redémarrage n'est pas nécessaire, et 1 si 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
42
xddsg

À propos de la comparaison des noyaux installés avec celui 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 cela pourra aider!

33
alexm

Vous compareriez la sortie de uname -a avec la liste des paquets du noyau installés

7
Dominik

uname -a contre. rpm -q kernel et needs-restarting de yum-utils

6
ptman

Une chose qui peut être utile à considérer en termes de "est un redémarrage requis" est de savoir s'il existe des fichiers qui 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 utilisé par un processus, le fichier lui-même peut avoir été marqué pour suppression, mais le processus continue d'utiliser l'ancien fichier car il a un descripteur de fichier ouvert vers l'inode de l'ancien fichier.

Une commande pour obtenir un décompte du nombre d'anciens fichiers encore utilisés:

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

Cette commande vous donnera un décompte des fichiers.

Utilisez-le à la place pour voir quels fichiers sont réellement utilisés:

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

Cette commande produira une sortie similaire à la suivante sur une boîte mise à jour 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
5
GrangerX

Vérifiez si le noyau en cours d'exécution est le dernier.

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

Sinon, 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
2
Nicolas Melay

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
1
sandman

Je sais que cette question a déjà reçu une réponse et que les gens ont publié des informations sur la vérification des noyaux plus récents 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 condition est détectée, le redémarrage est prévu 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}"
1
Liczyrzepa