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 systemctl
per l'arresto corretto, kexec -e
eseguirà direttamente)
systemctl kexec
Si noti che se si crea un kexec-load@.service
come spiegato nel wiki, se si riavvia, il riavvio systemd
automatico verrà kexec
eseguito 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 cosasystemd
necessario riavviare PID 1 ( stesso), è possibile farlo utilizzandosystemctl daemon-reexec
systemctl restart dbus.service
interrompe alcuni altri servizi, devono essere riavviati dopo il riavvio del dbus:
systemd
si: systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
non lo riavvierà finché sarai connesso, vedo 2 opzioni:
systemctl restart sshd
usando i at/cron/systemd
timerSSH
utilizzando un'altra shell remota (sicura) comemosh
screen/tmux
può anche bloccare servizi come il SSH
riavvio, 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