Antworten:
Der beste Weg ist, herauszufinden, welche Programme / Dienste die alten Bibliotheken verwenden, und sie neu zu starten. Und Sie können dies erreichen, indem Sie alle verwendeten Dateien mit 'lsof' auflisten und diejenigen mit dem Typ 'DEL' suchen. DEL bedeutet, dass der Dateiname aus dem Dateisystem entfernt wurde, aber immer noch im Speicher steckt, weil jemand ihn verwendet.
Hier ist die vollständige Befehlszeile:
sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
Der einzige zwingende Grund für einen Neustart ist ein neuer Kernel (und Sie können einen Neustart mit kexec durchführen). Weitere Informationen finden Sie unter https://wiki.archlinux.org/index.php/Kexec.
Laden Sie den neuen Kernel initramfs und geben Sie die Boot-Cmdline an
kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
aufrufen kexec
( systemctl
zum richtigen Herunterfahren verwenden, kexec -e
würde direkt ausführen)
systemctl kexec
Beachten Sie, dass, wenn Sie ein kexec-load@.service
wie im Wiki beschriebenes erstellen , beim Neustart systemd
automatisch ein Soft-Neustart durchgeführt wird, kexec
anstatt einen BIOS-Neustart durchzuführen
Wenig verbesserte Version, die Systemd-Dienstnamen angibt:
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
oder einzeilig:
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
Beachten Sie, dass es einige Probleme gibt:
systemctl daemon-reload
sollte ausgeführt werden, bevor etwas anderes neu gestartet wirdsystemd
selbst) neu gestartet werden muss, kann dies mithilfe von erfolgensystemctl daemon-reexec
systemctl restart dbus.service
Bricht ein paar andere Dienste zusammen, müssen sie nach dem Neustart von dbus neu gestartet werden:
systemd
selbst: systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
nicht neu startet, solange Sie verbunden sind, werden zwei Optionen angezeigt:
systemctl restart sshd
mit at/cron/systemd
TimernSSH
mit einer anderen (sicheren) Remote-Shell neu, zmosh
screen/tmux
blockiert möglicherweise auch den SSH
Neustart von Diensten. Am einfachsten ist es, diese Sitzungen vor dem Neustart von Diensten zu schließenEine einfache Möglichkeit besteht darin, die Version des ausgeführten Kernels mit dem neuesten Kernel auf der Festplatte zu vergleichen. Ich habe ein Skript gefunden , das das einfach macht.
Da ich mehrere Kernel installiert habe, habe ich das Skript so geändert, dass nur derjenige überprüft wird, der dem ausgeführten Kernel entspricht. Zum Beispiel habe ich momentan die Versionen 4.9.79 und 4.14.16 installiert und muss daher /boot/vmlinuz-4.14-x86_64 überprüfen. Leider funktioniert dies nicht, wenn ich mit der Verwendung von Version 5.1 beginne. Daher ist ein Update erforderlich (ersetzen Sie 4 durch 3) oder ich muss einen stabileren Weg finden.
Hier ist mein Drehbuch:
#!/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