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 systemctlpara el apagado correcto, kexec -ese ejecutaría directamente)
systemctl kexec
Tenga en cuenta que si crea una kexec-load@.servicecomo se explica en la wiki, si reinicia, systemdse reiniciará automáticamente utilizando en kexeclugar 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 cosasystemdsí) necesita reiniciarse, puede hacerse usandosystemctl daemon-reexecsystemctl restart dbus.service rompe algunos otros servicios, deben reiniciarse después del reinicio de dbus:
systemd sí mismo: systemctl daemon-reexecsystemd-logindsystemd-machineddbussystemctl restart sshdno lo reiniciará mientras esté conectado, veo 2 opciones:
systemctl restart sshdusando at/cron/systemdtemporizadoresSSHusando otro shell remoto (seguro) comomoshscreen/tmuxtambién puede bloquear servicios como el SSHreinicio, 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