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.
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éeneeds-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
Retour0
si le redémarrage n'est pas nécessaire, et1
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
À 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!
Vous compareriez la sortie de uname -a avec la liste des paquets du noyau installés
uname -a
contre. rpm -q kernel
et needs-restarting
de yum-utils
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
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
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
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}"