Respuestas:
La mejor manera es encontrar qué programas / servicios usan las bibliotecas antiguas y reiniciarlas. Y puede lograrlo al enumerar todos los archivos usados usando 'lsof' y encontrar aquellos que tienen el tipo 'DEL'. DEL significa que el nombre de archivo se eliminó del sistema de archivos, pero todavía está atascado en la memoria porque alguien lo usa.
Aquí está la línea de comando completa:
sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
La única razón obligatoria para reiniciar es un nuevo kernel (y puede reiniciar mediante kexec). Ver https://wiki.archlinux.org/index.php/Kexec para más detalles, en resumen:
cargar el nuevo kernel, initramfs y especificar el cmdline de arranque
kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
invocar kexec
(usar systemctl
para el apagado correcto, kexec -e
se ejecutaría directamente)
systemctl kexec
Tenga en cuenta que si crea una kexec-load@.service
como se explica en la wiki, si reinicia, systemd
se reiniciará automáticamente utilizando en kexec
lugar de reiniciar la BIOS.
Versión un poco mejorada que da nombres de servicio 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
o una línea:
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
Tenga en cuenta que hay algunos problemas:
systemctl daemon-reload
debe ejecutarse antes de reiniciar cualquier otra cosasystemd
sí) necesita reiniciarse, puede hacerse usandosystemctl daemon-reexec
systemctl restart dbus.service
rompe algunos otros servicios, deben reiniciarse después del reinicio de dbus:
systemd
sí mismo: systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
no lo reiniciará mientras esté conectado, veo 2 opciones:
systemctl restart sshd
usando at/cron/systemd
temporizadoresSSH
usando otro shell remoto (seguro) comomosh
screen/tmux
también puede bloquear servicios como el SSH
reinicio, la forma más fácil es cerrar estas sesiones antes de reiniciar los serviciosUna manera fácil es comparar la versión del núcleo en ejecución con el último núcleo en el disco. Encontré un script que puede hacerlo fácilmente.
Como tengo varios núcleos instalados, modifiqué el script para verificar solo el que corresponde al núcleo en ejecución. Por ejemplo, actualmente tengo instaladas las versiones 4.9.79 y 4.14.16 y, por lo tanto, necesito verificar /boot/vmlinuz-4.14-x86_64. Desafortunadamente, esto no funcionará cuando empiece a usar la versión 5.1, por lo que se necesitará una actualización (reemplazar 4 por 3) o necesito encontrar una forma más sólida.
Aquí está mi guión:
#!/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