Se houver atualizações no kernel, glibc ou systemd, você pode querer reiniciar para que as versões atualizadas estejam em uso. Se você tiver, digamos, atualizações em seu ambiente de área de trabalho, um simples logout / login será suficiente.
após a execução
sudo pacman -Syyu
ou
sudo pacman -S [something to install]
devo recomeçar apenas para estar seguro?
Se houver atualizações no kernel, glibc ou systemd, você pode querer reiniciar para que as versões atualizadas estejam em uso. Se você tiver, digamos, atualizações em seu ambiente de área de trabalho, um simples logout / login será suficiente.
A melhor maneira é descobrir quais programas / serviços usam as bibliotecas antigas e reiniciá-las. E você pode conseguir listando todos os arquivos usados usando 'lsof' e encontrar aqueles que têm o tipo 'DEL'. DEL significa 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
A única razão obrigatória para reiniciar é um novo kernel (e você pode reinicializar usando o kexec). Consulte o link para obter detalhes, em suma:
carregue o novo kernel, initramfs e especifique o cmdline de inicialização
kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
invoque kexec
(use systemctl
para o encerramento adequado, kexec -e
será executado diretamente)
systemctl kexec
Observe que, se você criar um [email protected]
como explicado no wiki, se você reiniciar, systemd
será automaticamente reinicializado usando kexec
em vez de fazer uma reinicialização bios
Versão pouco melhorada que fornece nomes de serviço do 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 há alguns problemas:
systemctl daemon-reload
deve ser executado antes de reiniciar qualquer outra coisa systemd
propriamente dito) precisar ser reiniciado, isso pode ser feito usando systemctl daemon-reexec
systemctl restart dbus.service
quebra alguns outros serviços, eles precisam ser reiniciados após o reinício do dbus:
systemd
em si: systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
não for reiniciado enquanto estiver conectado, vejo duas opções:
systemctl restart sshd
usando at/cron/systemd
timers SSH
usando outro shell remoto (seguro), como mosh
screen/tmux
também pode bloquear serviços como SSH
de reiniciar, a maneira mais fácil é fechar essas sessões antes de reiniciar os serviços Uma maneira fácil é comparar a versão do kernel em execução com o kernel mais recente no disco. Eu encontrei um script que pode fazer isso facilmente.
Como eu tenho vários kernels instalados, modifiquei o script para checar apenas o que corresponde ao kernel em execução. Por exemplo, atualmente tenho 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, então uma atualização será necessária (substitua 4 por 3) ou eu 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