Comment savoir, à partir de la ligne de commande, si la machine nécessite un redémarrage?

256

Lorsque vous installez certaines mises à jour (par exemple, un nouveau noyau) dans Ubuntu Desktop, vous recevez une indication qu'un redémarrage est requis (dans Lucid, l'icône de déconnexion devient rouge).

Comment vérifier, à partir de la ligne de commande, si un serveur Ubuntu nécessite un redémarrage?

Je pouvais m'engager pour «redémarrage du système requis» /etc/motd, mais j'aimerais une solution plus élégante. De plus, je veux une solution qui fonctionne dans les versions plus anciennes, par exemple Hardy (8.04 LTS).

Marius Gedminas
la source
Si vous maintenez le serveur, vous aurez bientôt aussi le sens de savoir si la mise à jour nécessite un redémarrage. La plupart des mises à jour ne nécessitent aucun redémarrage ou seulement un redémarrage du service (cela devrait se faire automatiquement).
eXlin

Réponses:

289

Vous pouvez simplement vérifier si le fichier /var/run/reboot-requiredexiste ou non.

Par exemple, n'importe lequel de ceux-ci vous dirait "aucun fichier de ce type" ou "fichier introuvable" si vous n'avez pas besoin de redémarrer, sinon (si vous avez besoin de redémarrer) le fichier existerait et ces commandes afficheraient des informations sur le fichier:

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

Dans un script bash, vous pouvez utiliser:

#!/bin/bash
if [ -f /var/run/reboot-required ]; then
  echo 'reboot required'
fi
Weboide
la source
1
Cela fonctionne, et cela fonctionne aussi sur Hardy. (Ne fonctionne pas sur Dapper - 6.06 - que j'ai toujours sur une machine. Difficile.) Par ailleurs, le fichier / var / run / reboot-required est créé par / usr / share / update-notifier / notify-reboot -required qui est appelé à partir des scripts de maintenance de divers packages.
Marius Gedminas le
2
Cela fonctionnerait également sur Dapper si j'installais le paquet update-notifier, sauf qu'il souhaitait transférer des éléments de GNOME d'une capacité de 120 mégas / octets dans mon ancien serveur.
Marius Gedminas le
10
Mieux installer update-notifier-common, cela ne dépend d'aucun élément graphique (mais n'existe pas pour Dapper).
Marius Gedminas le
1
FWIW, update-notifier-common n'est pas installé sur le serveur Lucid par défaut.
Marius Gedminas le
5
Merci! et le fichier /var/run/reboot-required.pkgslistera les packages qui nécessitent le redémarrage.
nealmcb
44

Dans le paquet debian-goodies se trouve une commande nommée checkrestartqui est très utile. Sa sortie peut vous aider à éviter un redémarrage complet.

Il vous indique quelles applications en cours ont chargé des bibliothèques partagées mises à niveau pendant l'exécution de l'application. Vous redémarrez ensuite les applications et les services manuellement et évitez un redémarrage complet. N'aide pas avec les mises à niveau du noyau, cependant.

aquaherd
la source
1
Comment cela peut-il me faire éviter un redémarrage complet?
Oxwivi
11
Il vous indique quelles applications en cours ont chargé des bibliothèques partagées qui ont été mises à niveau pendant l'exécution de l'application. Vous redémarrez ensuite les applications et les services manuellement et évitez un redémarrage complet. N'aide pas avec les mises à niveau du noyau, cependant.
aquaherd
Cela devrait être la meilleure réponse. Très utile. OpenSUSE a un outil intégré (et vous aide également à l’exécuter). Dommage que Ubuntu se contente de "redémarrer, redémarrer". Par exemple, Colord avait besoin d'un redémarrage ici. Par conséquent, pas besoin de redémarrer.
Apache
@aquaherd Commentaire très utile - cela pourrait valoir la peine de l'insérer dans votre réponse?
Duncan Jones
33

Normalement si le fichier

/var/run/reboot-required 

existe vous devez redémarrer. Vous pouvez voir si ce fichier est là en utilisant cette commande simple dans gnome-terminal.

ls /var/run/reboot-required
kone4040
la source
Ce fichier ne semble plus avoir été créé à partir du update-notifier-common utilisé pour le créer.
Scott
17

Outre les méthodes les plus directes écrites par d'autres utilisateurs, il existe une indication pratique si vous utilisez byobu - un ensemble de scripts permettant de rendre GNU screen un peu plus convivial. Il affiche un ensemble d'informations en bas de l'écran, qui peut indiquer si un redémarrage est requis - avec la disponibilité des mises à jour, la durée, la disponibilité, la mémoire utilisée, etc.

Sur cette capture d'écran, vous pouvez voir 199!sur la ligne inférieure avec l'arrière-plan rouge qu'il y a 199 mises à jour disponibles. A !! signifie que certaines sont des mises à jour de sécurité . Le menu au premier plan sélectionne les notifications d'état à afficher.

Si un redémarrage est requis, cela sera indiqué par le symbole (R)affiché dans la barre inférieure avec du texte blanc sur fond bleu. Plus de détails et d’autres indicateurs peuvent être lus dans la page de manuel de byobu .

capture d'écran

Hamish Downer
la source
9

Le /etc/motdfichier obtient ses informations pour savoir si un redémarrage est requis à partir du /var/run/reboot-requiredfichier.

Vous pouvez vérifier le contenu de ce fichier dans le terminal en utilisant la cat /etc/motdcommande

ajmitch
la source
update-notifier-common utilisé pour créer cela mais ne le fait plus
Scott
8

Si les packages reboot-notifier ou update-notifier-common sont installés, vous obtenez les fichiers / var / run / reboot-required et /var/run/reboot-required.pkgs.

reboot-notifier est plus récent dans Ubuntu Wily et Xenial. Tronçon Debian, mais dans jessie-backports

update-notifier-common Est plus ancien, dans toutes les versions d'Ubuntu, y compris Xenial et Debian Wheezy. Pas dans Debian Stretch ou Jessie.

(Le paquetage reboot-notifier contient des informations générales à l' adresse https://feeding.cloud.geek.nz/posts/introducing-reboot-notifier/ )

Si ces packages ne sont pas installés, vous pouvez comparer la version du package linux installée à la version en cours d'exécution:

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)

Vous pouvez voir ici que le dernier noyau installé est 3.16.7-ckt20-1 + deb8u4, mais que le noyau en cours d’exécution est 3.16.7-ckt20-1 + deb8u3. Donc, ce système a besoin d'un redémarrage. Le U4 vs U3 à la fin.

Vous devrez peut-être faire défiler la case ci-dessus. Dans / proc / version, c'est la version proche de la fin de la ligne qui compte.

Le changement de code de version très mineur est typique d'une mise à jour du noyau de sécurité Debian.

besoin de redémarrer

Une autre option consiste à installer le needrestartpackage.

sudo apt-get install needrestart
sudo needrestart -k

Semble fonctionner même si needrestart a été installé après la mise à niveau du noyau.

Tim Bray
la source
1
Comment votre premier paragraphe est-il en corrélation avec les versions d'Ubuntu?
Muru
Bon point. Merci. J'avais passé tellement de temps à tester et à essayer les paquets que je l'avais manqué. J'ai édité pour rendre plus clair et inclure des informations sur les paquets Ubuntu.
Tim Bray
De retour sur 8.04, après une mise à jour nécessitant un redémarrage, le Cog deviendrait rouge. Comment puis-je récupérer ce comportement?
PenguinCSC
Ubuntu 14.04, je reçoisdpkg-query: no packages found matching linux-image-*
the_nuts le
Unknown option: kdans Ubuntu 14.04.
Cees Timmerman
7

J'ai ajouté ce qui suit à mon fichier .bash-aliases:

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

Cela semblait plus simple que d'installer un paquet pour cette tâche relativement simple. Alors je cours juste:

you@somewhere:~$ rr
No reboot needed
you@somewhere:~$ 
Capricorne1
la source
1

La solution du pauvre:

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

(Remarque: les trois cas de crochets contenant des espaces doivent être "[<espace> <tab>]".)

Enrique Perez-Terron
la source
grub 2 n'utilise plus /boot/grub/menu.lst, c'est /boot/grub/grub.cfg maintenant.
Marius Gedminas
-1

Pas une réponse à la question, mais une mise en garde concernant plusieurs des réponses: /var/run/reboot-requiredn’est pas une source fiable permettant de savoir si un redémarrage est réellement nécessaire ou non.

Test simple: quand un nouveau noyau devient disponible, installez-le, redémarrez. Après le redémarrage, exécutez-vous apt autoremovepour vous débarrasser de certains anciens noyaux. Une fois que vous avez exécuté cela, il sera indiqué qu'un redémarrage est requis, ce qui est un non-sens.

tink
la source
3
Bien, supprimer un noyau génère à nouveau votre fichier de configuration grub, après quoi il est probablement conseillé de redémarrer l'ordinateur pour vérifier que vous pouvez toujours démarrer. Au moins c'est comme ça que je justifie cette (mauvaise) caractéristique à moi-même.
Marius Gedminas