Réponses:
La meilleure façon est de trouver quels programmes / services utilisent les anciennes bibliothèques et de les redémarrer. Et vous pouvez y parvenir en listant tous les fichiers utilisés en utilisant 'lsof' et en trouvant ceux qui ont le type 'DEL'. DEL signifie que le nom de fichier a été supprimé du système de fichiers mais il est toujours bloqué en mémoire car quelqu'un l'utilise.
Voici la ligne de commande complète:
sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
La seule raison obligatoire de redémarrer est un nouveau noyau (et vous pouvez redémarrer en douceur en utilisant kexec). Voir https://wiki.archlinux.org/index.php/Kexec pour plus de détails, en bref:
charger le nouveau noyau, initramfs et spécifier la cmdline de démarrage
kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
invoke kexec(à utiliser systemctlpour un arrêt correct, kexec -es'exécuterait directement)
systemctl kexec
Notez que si vous créez un kexec-load@.servicecomme expliqué dans le wiki, si vous redémarrez, il redémarrera systemdautomatiquement en utilisant à la kexecplace de faire un redémarrage du BIOS
Version légèrement améliorée qui donne des noms de service 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 une ligne:
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
Notez qu'il y a quelques problèmes:
systemctl daemon-reload doit être exécuté avant de redémarrer autre chosesystemdlui-même) doit être redémarré, cela peut être fait en utilisantsystemctl daemon-reexecsystemctl restart dbus.service interrompt certains autres services, ils doivent être redémarrés après le redémarrage du dbus:
systemd lui-même: systemctl daemon-reexecsystemd-logindsystemd-machineddbussystemctl restart sshdne le redémarrera pas tant que vous serez connecté, je vois 2 options:
systemctl restart sshdaide de at/cron/systemdminuteriesSSHaide d'un autre shell distant (sécurisé) tel quemoshscreen/tmuxpeut également bloquer des services comme le SSHredémarrage, la manière la plus simple est de fermer ces sessions avant de redémarrer les servicesUn moyen simple consiste à comparer la version du noyau en cours d'exécution au dernier noyau sur le disque. J'ai trouvé un script qui peut le faire facilement.
Comme j'ai plusieurs noyaux installés, j'ai modifié le script pour ne vérifier que celui correspondant au noyau en cours d'exécution. Par exemple, j'ai actuellement les versions 4.9.79 et 4.14.16 installées et j'ai donc besoin de vérifier /boot/vmlinuz-4.14-x86_64. Malheureusement, cela ne fonctionnera pas lorsque je commencerai à utiliser la version 5.1, donc une mise à jour sera nécessaire (remplacer 4 par 3) ou je dois trouver un moyen plus robuste.
Voici mon 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