Come posso sapere, dalla riga di comando, se la macchina richiede un riavvio?


256

Quando si installano determinati aggiornamenti (ad es. Un nuovo kernel) in Ubuntu Desktop, si ottiene l'indicazione che è necessario un riavvio (in Lucid, l'icona di disconnessione diventa rossa).

Come posso verificare, dalla riga di comando, se un server Ubuntu richiede un riavvio?

Potrei grep per "Richiesto riavvio del sistema" /etc/motd, ma vorrei una soluzione più elegante. Inoltre, voglio una soluzione che funzioni con versioni precedenti, ad esempio Hardy (8.04 LTS).


Se si mantiene il server, presto si svilupperà anche il senso se l'aggiornamento o il mancato aggiornamento richiedono il riavvio. La maggior parte degli aggiornamenti non necessita di riavvio o solo riavvio del servizio (che dovrebbe avvenire automaticamente).
eXlin,

Risposte:


289

Puoi semplicemente controllare se il file /var/run/reboot-requiredesiste o no.

Ad esempio, uno qualsiasi di questi ti direbbe "nessun file di questo tipo" o "file non trovato" se non è necessario riavviare, altrimenti (se è necessario riavviare) il file esisterebbe e questi comandi mostrerebbero informazioni sul file:

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

In uno script bash, puoi usare:

#!/bin/bash
if [ -f /var/run/reboot-required ]; then
  echo 'reboot required'
fi

1
Funziona e funziona anche su Hardy. (Non funziona su Dapper - 6.06 - che ho ancora su una macchina. Duro.) Per inciso, il file / var / run / reboot-richiesto è creato da / usr / share / update-notifier / notification-reboot -quisito richiesto che viene invocato dagli script del manutentore di vari pacchetti.
Marius Gedminas,

2
Funzionerebbe anche su Dapper se avessi installato il pacchetto update-notifier, tranne per il fatto che voleva trasferire nel mio antico server roba GNOME del valore di 120 mega.
Marius Gedminas,

10
Meglio installare update-notifier-common, non dipende da alcun elemento della GUI (ma non esiste per Dapper).
Marius Gedminas,

1
FWIW, update-notifier-common non è installato sul server Lucid per impostazione predefinita.
Marius Gedminas,

5
Grazie! e il file /var/run/reboot-required.pkgselencherà i pacchetti che richiedono il riavvio.
nealmcb,

44

Nel pacchetto debian-goodies c'è un comando chiamato checkrestartche è abbastanza utile. Il suo output può aiutarti a evitare un riavvio completo.

Indica quali applicazioni in esecuzione hanno caricato librerie condivise che sono state aggiornate mentre l'applicazione era in esecuzione. Quindi riavviare le applicazioni e i servizi manualmente ed evitare un riavvio completo. Tuttavia, non aiuta con gli aggiornamenti del kernel.


1
Come posso farmi evitare un riavvio completo?
Oxwivi,

11
Indica quali applicazioni in esecuzione hanno caricato librerie condivise che sono state aggiornate mentre l'applicazione era in esecuzione. Quindi riavviare le applicazioni e i servizi manualmente ed evitare un riavvio completo. Tuttavia, non aiuta con gli aggiornamenti del kernel.
aquaherd,

Questa dovrebbe essere la risposta migliore. Molto utile. OpenSUSE ha uno strumento integrato (e ti aiuta anche come eseguirlo). Peccato che Ubuntu vada semplicemente "riavvia, riavvia". Ad esempio, colord aveva bisogno di un riavvio qui. Quindi, non è necessario riavviare.
Shiki,

@aquaherd Commento molto utile - potrebbe valere la pena inserirlo nella tua risposta?
Duncan Jones,

33

Normalmente se il file

/var/run/reboot-required 

esiste che è necessario riavviare. Puoi vedere se questo file è presente usando questo semplice comando in gnome-terminal.

ls /var/run/reboot-required

Questo file non sembra più essere creato dall'aggiornamento-notificatore-comune utilizzato per crearlo.
Scott,

17

Oltre ai metodi più diretti scritti da altri, c'è un'utile indicazione se usi byobu - una serie di script per rendere lo schermo GNU un po 'più facile da usare. Mostra una serie di informazioni nella parte inferiore dello schermo e può includere l'eventuale necessità di un riavvio, oltre alla disponibilità di aggiornamenti, l'ora, il tempo di attività, la memoria utilizzata ...

In questo screenshot puoi vedere 199!dall'ultima riga con lo sfondo rosso che ci sono 199 aggiornamenti disponibili. Un !! significa che alcuni sono aggiornamenti di sicurezza . Il menu in primo piano seleziona quali notifiche di stato devono essere visualizzate.

Se è necessario un riavvio, questo sarà indicato dal simbolo (R)visualizzato nella barra inferiore con testo bianco su sfondo blu. Maggiori dettagli e altri indicatori possono essere letti nella pagina man byobu .

immagine dello schermo


9

Il /etc/motdfile ottiene le informazioni sulla necessità di riavviare il /var/run/reboot-requiredfile dal file.

Puoi controllare il contenuto di questo file nel terminale usando il cat /etc/motdcomando


update-notifier-common usato per creare questo, ma non lo fa più
Scott

8

Se hai i pacchetti reboot-notifier o update-notifier-common installati, ottieni i file / var / run / reboot-required e /var/run/reboot-required.pkgs

reboot-notifier è più recente in Ubuntu Wily e Xenial. Tratto Debian, ma in jessie-backport

update-notifier-common È più vecchio, in tutte le versioni di Ubuntu tra cui Xenial e Debian Wheezy. Non in Debian Stretch o Jessie.

(C'è un po 'di background nel pacchetto reboot-notifier su https://feeding.cloud.geek.nz/posts/introducing-reboot-notifier/ )

Se non hai installato questi pacchetti, puoi confrontare la versione del pacchetto Linux installata con la versione in esecuzione:

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 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian <b>3.16.7-ckt20-1+deb8u3</b> (2016-01-17)

Qui puoi vedere che l'ultimo kernel installato è 3.16.7-ckt20-1 + deb8u4 ma il kernel in esecuzione è 3.16.7-ckt20-1 + deb8u3. Quindi questo sistema ha bisogno di un riavvio. L'U4 contro l'U3 proprio alla fine.

Potrebbe essere necessario scorrere la casella sopra. Nella versione / proc /, è la versione vicino alla fine della riga che conta.

La modifica del codice della versione molto piccola è tipica di un aggiornamento del kernel di sicurezza Debian.

needrestart

Un'altra opzione è installare il needrestartpacchetto.

sudo apt-get install needrestart
sudo needrestart -k

Sembra funzionare anche se needrestart è stato installato dopo l'aggiornamento del kernel.


1
In che modo il tuo primo paragrafo è correlato alle versioni di Ubuntu?
muru,

Buon punto. Grazie. Avevo passato così tanto tempo a provare e provare i pacchetti che mi mancavano un po '. Ho modificato per chiarire e includere le informazioni sul pacchetto ubuntu.
Tim Bray,

Indietro 8.04, dopo un aggiornamento che richiedeva un riavvio, il Cog sarebbe diventato rosso. Come posso ottenere quel comportamento?
PenguinCSC

Ubuntu 14.04, ottengodpkg-query: no packages found matching linux-image-*
the_nuts il

Unknown option: kin Ubuntu 14.04.
Cees Timmerman,

7

Ho aggiunto quanto segue al mio file .bash-aliases:

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

Sembrava più semplice dell'installazione di un pacchetto per questa attività relativamente semplice. Quindi corro:

you@somewhere:~$ rr
No reboot needed
you@somewhere:~$ 

1

Povera soluzione dell'uomo:

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

(Nota: i tre casi di parentesi quadre con spazi bianchi all'interno dovrebbero essere "[<space> <tab>]".)


grub 2 non usa più /boot/grub/menu.lst, ora è /boot/grub/grub.cfg.
Marius Gedminas il

-1

Non una risposta alla domanda, ma un avvertimento per quanto riguarda alcune delle risposte: non lo/var/run/reboot-required è una fonte affidabile per sapere se è effettivamente necessario o meno un riavvio.

Test semplice: quando diventa disponibile un nuovo kernel, installalo, riavvia. Dopo il riavvio, corri apt autoremoveper sbarazzarti di alcuni kernel vecchi, non più necessari. Dopo averlo eseguito, indicherà che è necessario un riavvio, che è un'assurdità completa.


3
Bene, la rimozione di un kernel genera nuovamente il file di configurazione di grub, dopodiché è probabilmente una buona idea riavviare, per verificare che sia ancora possibile avviarsi. Almeno è così che sto giustificando questa (mis) caratteristica per me stesso.
Marius Gedminas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.