Como posso saber, na linha de comando, se a máquina requer uma reinicialização?

256

Ao instalar determinadas atualizações (por exemplo, um novo kernel) no Ubuntu Desktop, você recebe uma indicação de que é necessário reiniciar (no Lucid, o ícone de logout fica vermelho).

Como posso verificar, na linha de comando, se um servidor Ubuntu requer uma reinicialização?

Eu poderia esperar por 'Reinicialização do sistema necessária' /etc/motd, mas gostaria de uma solução mais elegante. Além disso, quero uma solução que funcione em versões mais antigas, por exemplo, Hardy (8.04 LTS).

Marius Gedminas
fonte
Se você estiver mantendo o servidor, em breve também desenvolverá o sentido, quer a atualização não exija a reinicialização. A maioria das atualizações não precisa ser reiniciada ou apenas reiniciada do serviço (o que deve ser feito automaticamente).
eXlin

Respostas:

289

Você pode simplesmente verificar se o arquivo /var/run/reboot-requiredexiste ou não.

Por exemplo, qualquer uma dessas opções diria "não existe esse arquivo" ou "arquivo não encontrado" se você não precisar reinicializar; caso contrário (se precisar reinicializar), o arquivo existiria e esses comandos mostrariam informações sobre o arquivo:

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

Em um script bash, você pode usar:

#!/bin/bash
if [ -f /var/run/reboot-required ]; then
  echo 'reboot required'
fi
Weboide
fonte
1
Isso funciona e também funciona em Hardy. (Não funciona no Dapper - 6.06 - que ainda tenho em uma máquina. Difícil.) Aliás, o arquivo / var / run / reboot necessário é criado por / usr / share / update-notifier / notify-reboot -required, que é invocado a partir dos scripts de manutenção de vários pacotes.
Marius Gedminas
2
Também funcionaria no Dapper se eu instalasse o pacote notificador de atualização, exceto que ele deseja extrair 120 MB de material GNOME para o meu servidor antigo.
Marius Gedminas
10
Melhor instalar update-notifier-common, não depende de nada da GUI (mas não existe para o Dapper).
Marius Gedminas
1
FWIW, update-notifier-common não está instalado no servidor Lucid por padrão.
Marius Gedminas
5
Obrigado! e o arquivo /var/run/reboot-required.pkgslistará os pacotes que requerem a reinicialização.
Nealmcb
44

No pacote debian-goodies há um comando chamado checkrestartque é bastante útil. Sua saída pode ajudar a evitar uma reinicialização completa.

Ele informa quais aplicativos em execução carregaram bibliotecas compartilhadas que foram atualizadas enquanto o aplicativo estava em execução. Você então reinicia os aplicativos e serviços manualmente e evita uma reinicialização completa. Porém, não ajuda com atualizações do kernel.

aquaherd
fonte
1
Como isso pode me fazer evitar uma reinicialização completa?
Oxwivi 9/09/11
11
Ele informa quais aplicativos em execução carregaram bibliotecas compartilhadas que foram atualizadas enquanto o aplicativo estava em execução. Você então reinicia os aplicativos e serviços manualmente e evita uma reinicialização completa. Porém, não ajuda com atualizações do kernel.
aquaherd
Essa deve ser a resposta principal. Muito útil. O OpenSUSE possui uma ferramenta embutida (e também ajuda você a executá-la). Vergonha Ubuntu apenas vai "reiniciar, reiniciar". Por exemplo, o colord precisava ser reiniciado aqui. Portanto, não há necessidade de reiniciar.
Shiki
@aquaherd Comentário muito útil - pode valer a pena mudar isso para sua resposta?
Duncan Jones
33

Normalmente, se o arquivo

/var/run/reboot-required 

existe, você deve reiniciar. Você pode ver se esse arquivo está lá usando este comando simples no gnome-terminal.

ls /var/run/reboot-required
kone4040
fonte
Este arquivo não parece mais ser criado a partir do update-notifier-common que costumava criá-lo.
Scott
17

Assim como os métodos mais diretos escritos por outras pessoas, há uma indicação útil se você usar byobu - um conjunto de scripts para tornar a tela do GNU um pouco mais amigável. Ele mostra um conjunto de informações na parte inferior da tela e pode incluir se uma reinicialização é necessária - além de atualizações disponíveis, tempo, tempo de atividade, memória usada ...

Nesta captura de tela, você pode ver 199!na linha inferior, com o fundo vermelho, que existem 199 atualizações disponíveis. A !! significa que algumas são atualizações de segurança . O menu em primeiro plano está selecionando quais notificações de status devem ser exibidas.

Se uma reinicialização for necessária, isso será indicado pelo símbolo (R)exibido na barra inferior com texto em branco sobre fundo azul. Mais detalhes e outros indicadores podem ser lidos na página do manual byobu .

captura de tela

Hamish Downer
fonte
9

O /etc/motdarquivo obtém suas informações sobre se uma reinicialização é necessária a partir do /var/run/reboot-requiredarquivo.

Você pode verificar o conteúdo desse arquivo no terminal usando o cat /etc/motdcomando

ajmitch
fonte
update-notifier-comum usado para criar este, mas não faz mais
Scott
8

Se você possui os pacotes reboot-notifier ou update-notifier-common instalados, obtém os arquivos / var / run / reboot-required e /var/run/reboot-required.pkgs

O reboot-notifier é mais recente no Ubuntu Wily e Xenial. Extensão do Debian, mas em jessie-backports

update-notifier-common É mais antigo, em todas as versões do Ubuntu, incluindo Xenial e Debian Wheezy. Não no Debian Stretch ou Jessie.

(Há alguns antecedentes do pacote reboot-notifier em https://feeding.cloud.geek.nz/posts/introducing-reboot-notifier/ )

Se você não tiver esses pacotes instalados, poderá comparar a versão do pacote linux instalado, com a versão em execução:

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)

Você pode ver aqui que o kernel instalado mais recente é 3.16.7-ckt20-1 + deb8u4, mas o kernel em execução é 3.16.7-ckt20-1 + deb8u3. Portanto, este sistema precisa de uma reinicialização. O u4 vs u3 logo no final.

Pode ser necessário rolar a caixa acima. No / proc / version, é a versão próxima ao final da linha que importa.

A alteração muito pequena no código da versão é típica de uma atualização do kernel de segurança Debian.

needrestart

Outra opção é instalar o needrestartpacote.

sudo apt-get install needrestart
sudo needrestart -k

Parece funcionar mesmo que o needrestart tenha sido instalado após a atualização do kernel.

Tim Bray
fonte
1
Como o seu primeiro parágrafo se correlaciona com as versões do Ubuntu?
Muru
Bom ponto. Obrigado. Passei tanto tempo testando e testando os pacotes que perdi essa parte. Editei para tornar mais claro e incluir as informações do pacote ubuntu.
Tim Bray
No caminho 8.04, após uma atualização que exigia uma reinicialização, o Cog ficava vermelho. Como recupero esse comportamento?
PenguinCSC
Ubuntu 14.04, obtenhodpkg-query: no packages found matching linux-image-*
the_nuts 26/09/16
Unknown option: kno Ubuntu 14.04.
amigos estão dizendo sobre
7

Adicionei o seguinte ao meu arquivo .bash-aliases:

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

Parecia mais simples do que instalar um pacote para esta tarefa relativamente simples. Então eu apenas corro:

you@somewhere:~$ rr
No reboot needed
you@somewhere:~$ 
Capricórnio1
fonte
1

Solução do pobre homem:

#!/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: os três casos de colchetes com espaço em branco no interior devem ser "[<espaço> <guia>]".)

Enrique Perez-Terron
fonte
O grub 2 não usa mais o /boot/grub/menu.lst, agora é /boot/grub/grub.cfg.
Marius Gedminas
-1

Não é uma resposta para a pergunta, mas uma ressalva sobre várias das respostas: não/var/run/reboot-required é uma fonte confiável de se uma reinicialização é realmente necessária ou não.

Teste simples: quando um novo kernel estiver disponível, instale-o, reinicie. Após a reinicialização, corra apt autoremovepara se livrar de alguns kernels antigos e desnecessários. Depois de executá-lo, ele indicará que é necessária uma reinicialização, o que é um absurdo completo.

consertar
fonte
3
Bem, a remoção de um kernel gera novamente seu arquivo de configuração do grub, após o qual provavelmente é uma boa idéia reiniciar, para verificar se você ainda pode inicializar. Pelo menos é assim que justifico esse recurso (mis) para mim.
Marius Gedminas