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 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 coisasystemdsi) precisar ser reiniciado, isso poderá ser feito usandosystemctl daemon-reexecsystemctl restart dbus.service quebra alguns outros serviços, eles precisam ser reiniciados após o dbus restart:
systemd em si: systemctl daemon-reexecsystemd-logindsystemd-machineddbussystemctl restart sshdnão será reiniciado enquanto você estiver conectado, vejo duas opções:
systemctl restart sshdusando at/cron/systemdtemporizadoresSSHusando outro shell remoto (seguro) comomoshscreen/tmuxtambém pode bloquear serviços como o SSHreiní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