¿Cómo puedo saber, desde la línea de comandos, si la máquina requiere un reinicio?

256

Cuando instala ciertas actualizaciones (por ejemplo, un nuevo núcleo) en Ubuntu Desktop, obtiene una indicación de que es necesario reiniciar (en Lucid, el icono de cierre de sesión se vuelve rojo).

¿Cómo puedo verificar, desde la línea de comandos, si un servidor Ubuntu requiere un reinicio?

Podría buscar 'Reinicio del sistema requerido' /etc/motd, pero me gustaría una solución más elegante. Además, quiero una solución que funcione en versiones anteriores, por ejemplo, Hardy (8.04 LTS).

Marius Gedminas
fuente
Si está manteniendo el servidor, pronto también tendrá sentido si la actualización requiere o no reiniciar. La mayoría de las actualizaciones no necesitan reiniciar o solo reiniciar el servicio (lo que debería hacer automáticamente).
eXlin

Respuestas:

289

Simplemente puede verificar si el archivo /var/run/reboot-requiredexiste o no.

Por ejemplo, cualquiera de estos le diría "no existe tal archivo" o "archivo no encontrado" si no necesita reiniciar, de lo contrario (si necesita reiniciar) el archivo existiría y estos comandos mostrarían información sobre el archivo:

file /var/run/reboot-required
stat /var/run/reboot-required
ls /var/run/reboot-required

En un script bash, puedes usar:

#!/bin/bash
if [ -f /var/run/reboot-required ]; then
  echo 'reboot required'
fi
Weboide
fuente
1
Esto funciona, y también funciona en Hardy. (No funciona en Dapper - 6.06 - que todavía tengo en una máquina. Resistente.) Por cierto, / usr / share / update-notifier / notify-reboot crea el archivo / var / run / reboot-required. -required que se invoca desde los scripts de mantenimiento de varios paquetes.
Marius Gedminas
2
También funcionaría en Dapper si instalara el paquete de notificador de actualización, excepto que quiere extraer cosas de GNOME de 120 megas en mi antiguo servidor.
Marius Gedminas
10
Es mejor instalar update-notifier-common, no depende de ningún elemento de la GUI (pero no existe para Dapper).
Marius Gedminas
1
FWIW, update-notifier-common no está instalado en el servidor Lucid de forma predeterminada.
Marius Gedminas
55
¡Gracias! y el archivo /var/run/reboot-required.pkgsenumerará los paquetes que requieren reiniciar.
nealmcb
44

En el paquete debian-goodies hay un comando llamado checkrestartque es bastante útil. Su salida puede ayudarlo a evitar un reinicio completo.

Le indica qué aplicaciones en ejecución han cargado bibliotecas compartidas que se actualizaron mientras se ejecutaba la aplicación. Luego reinicia las aplicaciones y servicios manualmente y evita un reinicio completo. Sin embargo, no ayuda con las actualizaciones del kernel.

aquaherd
fuente
1
¿Cómo puede hacerme evitar un reinicio completo?
Oxwivi
11
Le indica qué aplicaciones en ejecución han cargado bibliotecas compartidas que se actualizaron mientras se ejecutaba la aplicación. Luego reinicia las aplicaciones y servicios manualmente y evita un reinicio completo. Sin embargo, no ayuda con las actualizaciones del kernel.
aquaherd
Esta debería ser la mejor respuesta. Muy útil. OpenSUSE tiene una herramienta integrada (y también le ayuda a ejecutarla). Vergüenza Ubuntu simplemente va "reiniciar, reiniciar". Por ejemplo, colord necesitaba un reinicio aquí. Por lo tanto, no es necesario reiniciar.
Shiki
@aquaherd Comentario muy útil: ¿podría valer la pena trasladarlo a su respuesta?
Duncan Jones
33

Normalmente si el archivo

/var/run/reboot-required 

existe, debe reiniciar. Puede ver si este archivo está allí usando este comando simple en gnome-terminal.

ls /var/run/reboot-required
kone4040
fuente
Parece que este archivo ya no se creó a partir del update-notifier-common que solía crearlo.
Scott
17

Además de los métodos más directos escritos por otros, hay una indicación útil si usa byobu , un conjunto de scripts para hacer que la pantalla GNU sea un poco más fácil de usar. Muestra un conjunto de información en la parte inferior de la pantalla, y eso puede incluir si se requiere un reinicio, junto con si hay actualizaciones disponibles, el tiempo, el tiempo de actividad, la memoria utilizada ...

En esta captura de pantalla, puede ver desde la 199!línea inferior con el fondo rojo que hay 199 actualizaciones disponibles. A !! significa que algunas son actualizaciones de seguridad . El menú en primer plano selecciona qué notificaciones de estado se deben mostrar.

Si se requiere reiniciar, esto se indicará mediante el símbolo que se (R)muestra en la barra inferior con texto blanco sobre fondo azul. Se pueden leer más detalles y otros indicadores en la página de manual de byobu .

captura de pantalla

Hamish Downer
fuente
9

El /etc/motdarchivo obtiene su información sobre si es necesario reiniciar el /var/run/reboot-requiredarchivo.

Puede verificar el contenido de este archivo en la terminal utilizando el cat /etc/motdcomando

ajmitch
fuente
update-notifier-common solía crear esto, pero ya no lo hace
Scott
8

Si tiene instalados los paquetes reboot-notifier o update-notifier-common, obtendrá los archivos / var / run / reboot-required y /var/run/reboot-required.pkgs

reiniciar-notificador es más reciente en Ubuntu Wily y Xenial. Estiramiento de Debian, pero en jessie-backports

update-notifier-common es anterior, en todas las versiones de Ubuntu, incluidas Xenial y Debian Wheezy. No en Debian Stretch o Jessie.

(Hay algunos antecedentes del paquete de reinicio-notificador en https://feeding.cloud.geek.nz/posts/introducing-reboot-notifier/ )

Si no tiene estos paquetes instalados, puede comparar la versión del paquete de Linux instalada, con la versión en ejecución:

tim@tramp:~$ dpkg -l linux-image-*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                              Version               Architecture          Description
+++-=================================-=====================-=====================-=======================================================================
ii  linux-image-3.16.0-4-amd64        3.16.7-ckt20-1+deb8u4 amd64                 Linux 3.16 for 64-bit PCs
ii  linux-image-amd64                 3.16+63               amd64                 Linux for 64-bit PCs (meta-package)
tim@tramp:~$ more /proc/version
Linux version 3.16.0-4-amd64 ([email protected]) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian <b>3.16.7-ckt20-1+deb8u3</b> (2016-01-17)

Puede ver aquí que el último núcleo instalado es 3.16.7-ckt20-1 + deb8u4 pero el núcleo en ejecución es 3.16.7-ckt20-1 + deb8u3. Entonces este sistema necesita un reinicio. El u4 vs u3 justo al final.

Es posible que deba desplazarse por el cuadro de arriba. En la versión / proc /, lo que importa es la versión cerca del final de la línea.

El cambio de código de versión menor es típico de una actualización del núcleo de seguridad de Debian.

reinicio

Otra opción es instalar el needrestartpaquete.

sudo apt-get install needrestart
sudo needrestart -k

Parece funcionar incluso si se necesita reiniciar después de actualizar el kernel.

Tim Bray
fuente
1
¿Cómo se correlaciona tu primer párrafo con las versiones de Ubuntu?
Muru
Buen punto. Gracias. Había pasado tanto tiempo probando y probando los paquetes que me perdí ese bit. He editado para aclarar e incluir información del paquete ubuntu.
Tim Bray
En la versión 8.04, después de una actualización que requería un reinicio, el Cog se volvería rojo. ¿Cómo recupero ese comportamiento?
PenguinCSC
Ubuntu 14.04, obtengodpkg-query: no packages found matching linux-image-*
the_nuts
Unknown option: ken Ubuntu 14.04.
Cees Timmerman
7

Agregué lo siguiente a mi archivo .bash-aliases:

alias rr='if [ -f /var/run/reboot-required ]; then echo "reboot required"; else echo "No reboot needed"; fi'

Parecía más simple que instalar un paquete para esta tarea relativamente simple. Entonces solo corro:

you@somewhere:~$ rr
No reboot needed
you@somewhere:~$ 
Capricornio1
fuente
1

La solución del pobre hombre:

#!/bin/bash
default=$(sed -n 's/^default[   ]*\([0-9][0-9]*\).*/\1/p' /boot/grub/menu.lst | tail -1)
if [ "$default" = "" ]; then default=0; fi

want=$(sed -n 's/^kernel[       ]*\/boot\/vmlinuz-\([^  ]*\).*/\1/p' /boot/grub/menu.lst | sed -n "$((default+1))p")

running=$(uname -r)

if [ "$running" = "$want" ]
then
        : OK, do nothing
else
        echo "Running $running, want $want. Reboot required."
fi

(Aviso: los tres casos de corchetes con espacio en blanco en el interior deben ser "[<space> <tab>]").

Enrique Pérez-Terron
fuente
grub 2 ya no usa /boot/grub/menu.lst, ahora es /boot/grub/grub.cfg.
Marius Gedminas
-1

No es una respuesta a la pregunta, sino una advertencia con respecto a varias de las respuestas: no/var/run/reboot-required es una fuente confiable de si se requiere o no un reinicio.

Prueba simple: cuando un nuevo núcleo esté disponible, instálelo y reinicie. Después del reinicio, ejecute apt autoremovepara deshacerse de algunos núcleos antiguos, que ya no son necesarios. Después de ejecutar eso, indicará que se requiere un reinicio, lo cual es una completa tontería.

tink
fuente
3
Bueno, la eliminación de un núcleo vuelve a generar su archivo de configuración de grub, después de lo cual probablemente sea una buena idea reiniciar, para verificar que aún pueda arrancar. Al menos así es como estoy justificando esta (mala) característica para mí.
Marius Gedminas