Respostas:
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
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 systemctl
para o desligamento adequado, kexec -e
seria executado diretamente)
systemctl kexec
Observe que, se você criar um kexec-load@.service
como explicado no wiki, se você reiniciar, systemd
será automaticamente reinicializado automaticamente usando em kexec
vez 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 coisasystemd
si) 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
dbus
systemctl restart sshd
não será reiniciado enquanto você estiver conectado, vejo duas opções:
systemctl restart sshd
usando at/cron/systemd
temporizadoresSSH
usando outro shell remoto (seguro) comomosh
screen/tmux
também pode bloquear serviços como o SSH
reinício, a maneira mais fácil é fechar essas sessões antes de reiniciar os serviçosUma 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