¿Cómo puedo verificar desde la línea de comandos si es necesario reiniciar en RHEL o CentOS?

40

Estoy usando CentOS y Red Hat Enterprise Linux en algunas máquinas sin la GUI. ¿Cómo puedo verificar si las actualizaciones instaladas recientemente requieren un reinicio? En Ubuntu, estoy acostumbrado a verificar si /var/run/reboot-requiredestá presente.

Jim Hunziker
fuente

Respuestas:

34

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

No olvide que es posible que deba reiniciar debido a las actualizaciones de la biblioteca principal, al menos si es glibc. (Y también, los servicios pueden necesitar reiniciarse después de las actualizaciones).

Si instala el yum-utilspaquete, puede usar un comando llamado needs-restarting.

Puede usarlo tanto para verificar si se requiere un reinicio completo debido a las actualizaciones de las bibliotecas del núcleo o del núcleo (usando la -ropción), o qué servicios necesitan reiniciarse (usando la -sopción).

needs-restarting -rdevuelve 0si no es necesario reiniciar, y 1si lo es, por lo que es perfecto para usar en un script.

Un ejemplo:

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
fuente
1
Vale la pena mencionar que al menos la -sopción requiere acceso de root.
Paul Gear
2
Para Fedora, needs-restartinges un complemento DNF . No es compatible -ro -s(todavía).
Franklin Yu
30

Acerca de comparar los núcleos instalados con uno en ejecución:

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

¡Espero que ayude!

alexm
fuente
2
Al principio pensé que esto no funcionaba, ya que seguía diciéndome que reiniciara después de haberlo hecho, pero luego descubrí que si está utilizando una instancia de DigitalOcean, primero debe cambiar manualmente el núcleo desde su panel de control antes de reiniciar.
Programador
¿Hay alguna razón por la cual la kernel-cadena se está eliminando de la salida de rpm -q?
Zlemini
1
La kernel-cadena debe eliminarse para compararla con la salida de uname -r, que no la contiene.
alexm
7

Puede comparar la salida de uname -a con la lista de paquetes de kernel instalados

Dominik
fuente
2
¿Es un núcleo diferente la única razón por la que un servidor Linux necesitaría reiniciar?
Chris_K
1
Normalmente, cuando se mantiene dentro de los procesos de actualización de paquetes 'normales' (up2date, yum, etc.), no debería haber muchas otras razones para reiniciar el sistema además de la actualización del kernel
Dominik
Sospecho que ciertos otros paquetes pueden requerir reiniciar eben si el kernel no cambia (cuando instalé kexec-tools-2.0.0-258 en centos6.0 no había memoria reservada para el volcado)
nhed
El paquete pbis-open de BeyondTrust solicita al usuario reiniciar después de la instalación a través de stdout.
bshacklett
6

uname -avs. rpm -q kernely needs-restartingdesdeyum-utils

ptman
fuente
5

Una cosa que puede ser útil para mirar en términos de "es necesario reiniciar" es si hay o no archivos que hayan sido eliminados / reemplazados por la actualización, pero para los cuales los archivos antiguos aún se cargan / usan por procesos activos.

Básicamente, cuando YUM actualiza un archivo que está en uso por un proceso, el archivo en sí puede haber sido marcado para su eliminación, pero el proceso sigue usando el archivo antiguo ya que tiene un descriptor de archivo abierto al inodo del archivo anterior.

Un comando para obtener un recuento de la cantidad de archivos antiguos que todavía están en uso:

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

Ese comando le dará un recuento de los archivos.

Use esto en su lugar para ver qué archivos están realmente en uso:

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

Ese comando producirá una salida similar a la siguiente en un cuadro actualizado 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
fuente
2

Compruebe si ejecutar kernel es el último.

Si no es así, verifique si el sistema se reinició desde la instalación del kernel.

Si no fue así, reinicie.

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
fuente
Esto no funciona si tiene una versión de kernel habilitada para PAE. El comando uname -r devuelve el sufijo PAE después de la parte .elX pero no los nombres rpm.
Yanick Girouard el
1

Sé que esta pregunta ya ha sido respondida y que la gente ha publicado información sobre la verificación de nuevos núcleos y archivos eliminados, pero recientemente escribí un script que verifica ambos. Si se detecta cualquiera de las condiciones, el reinicio está programado para +30 minutos.

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

Aquí está mi versión del código alexm. Puedes hacerlo:

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
Sandman
fuente
-5

install.log install.log.syslog yum.log revisas este lugar lo que tiene todo nuevo rpm tiene que instalar

Rajat
fuente