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 systemctl
pour un arrêt correct, kexec -e
s'exécuterait directement)
systemctl kexec
Notez que si vous créez un kexec-load@.service
comme expliqué dans le wiki, si vous redémarrez, il redémarrera systemd
automatiquement en utilisant à la kexec
place 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 chosesystemd
lui-même) doit être redémarré, cela peut être fait en utilisantsystemctl daemon-reexec
systemctl 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-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
ne le redémarrera pas tant que vous serez connecté, je vois 2 options:
systemctl restart sshd
aide de at/cron/systemd
minuteriesSSH
aide d'un autre shell distant (sécurisé) tel quemosh
screen/tmux
peut également bloquer des services comme le SSH
redé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