Risposte:
Il modo migliore è trovare quali programmi / servizi utilizzano le vecchie librerie e riavviarle. E puoi ottenerlo elencando tutti i file usati usando 'lsof' e trovare quelli che hanno il tipo 'DEL'. DEL significa che il nome file è stato rimosso dal filesystem ma è ancora bloccato in memoria perché qualcuno lo utilizza.
Ecco la riga di comando completa:
sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
L'unico motivo obbligatorio per riavviare è un nuovo kernel (e puoi riavviare il sistema usando kexec). Vedi https://wiki.archlinux.org/index.php/Kexec per i dettagli, in breve:
carica il nuovo kernel, initramfs e specifica il cmdline di avvio
kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
invoke kexec(utilizzare systemctlper l'arresto corretto, kexec -eeseguirà direttamente)
systemctl kexec
Si noti che se si crea un kexec-load@.servicecome spiegato nel wiki, se si riavvia, il riavvio systemdautomatico verrà kexeceseguito automaticamente utilizzando invece di eseguire un riavvio del BIOS
Versione leggermente migliorata che fornisce nomi di servizi 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 riga:
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
Si noti che ci sono alcuni problemi:
systemctl daemon-reload dovrebbe essere eseguito prima di riavviare qualsiasi altra cosasystemdnecessario riavviare PID 1 ( stesso), è possibile farlo utilizzandosystemctl daemon-reexecsystemctl restart dbus.service interrompe alcuni altri servizi, devono essere riavviati dopo il riavvio del dbus:
systemd si: systemctl daemon-reexecsystemd-logindsystemd-machineddbussystemctl restart sshdnon lo riavvierà finché sarai connesso, vedo 2 opzioni:
systemctl restart sshdusando i at/cron/systemdtimerSSHutilizzando un'altra shell remota (sicura) comemoshscreen/tmuxpuò anche bloccare servizi come il SSHriavvio, il modo più semplice è chiudere queste sessioni prima di riavviare i serviziUn modo semplice è confrontare la versione del kernel in esecuzione con l'ultimo kernel su disco. Ho trovato una sceneggiatura che può farlo facilmente.
Dato che ho installato diversi kernel, ho modificato lo script per controllare solo quello corrispondente al kernel in esecuzione. Ad esempio, al momento ho installato le versioni 4.9.79 e 4.14.16 e quindi ho bisogno di controllare /boot/vmlinuz-4.14-x86_64. Sfortunatamente questo non funzionerà quando inizio a utilizzare la versione 5.1, quindi sarà necessario un aggiornamento (sostituire 4 per 3) o devo trovare un modo più affidabile.
Ecco la mia sceneggiatura:
#!/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