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( systemctlzum richtigen Herunterfahren verwenden, kexec -ewürde direkt ausführen)
systemctl kexec
Beachten Sie, dass, wenn Sie ein kexec-load@.servicewie im Wiki beschriebenes erstellen , beim Neustart systemdautomatisch ein Soft-Neustart durchgeführt wird, kexecanstatt 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 wirdsystemdselbst) neu gestartet werden muss, kann dies mithilfe von erfolgensystemctl daemon-reexecsystemctl restart dbus.service Bricht ein paar andere Dienste zusammen, müssen sie nach dem Neustart von dbus neu gestartet werden:
systemd selbst: systemctl daemon-reexecsystemd-logindsystemd-machineddbussystemctl restart sshdnicht neu startet, solange Sie verbunden sind, werden zwei Optionen angezeigt:
systemctl restart sshdmit at/cron/systemdTimernSSHmit einer anderen (sicheren) Remote-Shell neu, zmoshscreen/tmuxblockiert möglicherweise auch den SSHNeustart 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