Devo reiniciar após uma atualização do pacman?


Respostas:


10

Se houver atualizações no kernel, glibc ou systemd, convém reiniciar para que as versões atualizadas estejam em uso. Se você tem, por exemplo, atualizações no ambiente da área de trabalho, basta fazer um logout / login simples.


11

A melhor maneira é encontrar quais programas / serviços usam as bibliotecas antigas e reiniciá-las. E você pode conseguir isso listando todos os arquivos usados ​​usando 'lsof' e localizando aqueles que têm o tipo 'DEL'. DEL significa que o nome do arquivo foi removido do sistema de arquivos, mas ainda está preso na memória porque alguém o usa.

Aqui está a linha de comando completa:

 sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u

2
Depois de gerar essa lista de serviços e bibliotecas, ainda não está claro quais serviços do sistema precisam ser reiniciados. Portanto, embora eu saiba quais processos e bibliotecas precisam ser reiniciados, normalmente não é trivial determinar quais serviços reiniciar com base nessa lista.
precisa saber é o seguinte

6

O único motivo obrigatório para reiniciar é um novo kernel (e você pode reinicializar com o kexec). Veja https://wiki.archlinux.org/index.php/Kexec para obter detalhes, em resumo:

  • carregue o novo kernel, initramfs e especifique o cmdline de inicialização

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
  • invocar kexec(use systemctlpara o desligamento adequado, kexec -eseria executado diretamente)

    systemctl kexec
    
  • Observe que, se você criar um kexec-load@.servicecomo explicado no wiki, se você reiniciar, systemdserá automaticamente reinicializado automaticamente usando em kexecvez de fazer uma reinicialização da BIOS

Versão um pouco melhorada que fornece nomes de serviço systemd:

PIDS="(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u)"
for PID in $PIDS; do
    systemctl status $i
done | grep '●' | awk '{print $2}' | sort -u

ou uma linha:

for i in $(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u); do systemctl status $i; done | grep '●' | awk '{print $2}' | sort -u

Observe que existem alguns problemas:

  • systemctl daemon-reload deve ser executado antes de reiniciar qualquer outra coisa
  • se o PID 1 (em systemdsi) precisar ser reiniciado, isso poderá ser feito usandosystemctl daemon-reexec
  • systemctl restart dbus.service quebra alguns outros serviços, eles precisam ser reiniciados após o dbus restart:
    • systemd em si: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • provavelmente outro systemd - * / outros serviços que (fortemente) usam dbus
  • Se você estiver conectado via SSH, o SSH precisará ser reiniciado, mas systemctl restart sshdnão será reiniciado enquanto você estiver conectado, vejo duas opções:
    • agendar systemctl restart sshdusando at/cron/systemdtemporizadores
    • reinicie SSHusando outro shell remoto (seguro) comomosh
  • a execução screen/tmuxtambém pode bloquear serviços como o SSHreinício, a maneira mais fácil é fechar essas sessões antes de reiniciar os serviços
  • conforme informado em uma resposta anterior, pode ser necessário fazer logout / login, especialmente para sessões gráficas

1
você gostaria de melhorar a resposta explicando como o kexec é usado?
Rui F Ribeiro

0

Uma maneira fácil é comparar a versão do kernel em execução com o kernel mais recente no disco. Encontrei um script que pode fazer isso facilmente.

Como tenho vários kernels instalados, modifiquei o script para verificar apenas o correspondente ao kernel em execução. Por exemplo, atualmente tenho as versões 4.9.79 e 4.14.16 instaladas e, portanto, preciso verificar /boot/vmlinuz-4.14-x86_64. Infelizmente, isso não funcionará quando eu começar a usar a versão 5.1; portanto, será necessária uma atualização (substitua 4 por 3) ou preciso encontrar uma maneira mais robusta.

Aqui está o meu script:

#!/bin/sh
NEXTLINE=0
FIND=""
CURRENT_KERNEL=`uname -r`
KERNEL_PATH="/boot/vmlinuz-${CURRENT_KERNEL:0:4}"
for I in `file $KERNEL_PATH*`; do
  if [ ${NEXTLINE} -eq 1 ]; then
    FIND="${I}"
    NEXTLINE=0
   else
    if [ "${I}" = "version" ]; then NEXTLINE=1; fi
  fi
done
    if [ ! "${FIND}" = "" ]; then
      if [ ! "${CURRENT_KERNEL}" = "${FIND}" ]; then
    echo "Boot required"
  else echo "No boot required"
  fi
fi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.