Sollte ich nach einem Pacman-Upgrade neu starten?


Antworten:


10

Wenn es Aktualisierungen für den Kernel, glibc oder systemd gibt, möchten Sie möglicherweise neu starten, damit die aktualisierten Versionen verwendet werden. Wenn Sie beispielsweise Updates für Ihre Desktop-Umgebung haben, ist ein einfaches Abmelden / Anmelden ausreichend.


11

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

2
Nach der Erstellung dieser Liste von Diensten und Bibliotheken ist immer noch nicht klar, welche systemd-Dienste neu gestartet werden müssen. Obwohl ich weiß, welche Prozesse und Bibliotheken neu gestartet werden müssen, ist es daher in der Regel nicht einfach, anhand dieser Liste zu bestimmen, welche Dienste neu gestartet werden sollen.
bwv549,

6

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 wird
  • Wenn PID 1 ( systemdselbst) 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
    • wahrscheinlich andere systemd - * / andere dienste, die (stark) nutzen dbus
  • Wenn Sie über SSH verbunden sind und SSH neu gestartet werden muss, es aber systemctl restart sshdnicht neu startet, solange Sie verbunden sind, werden zwei Optionen angezeigt:
    • Zeitplan systemctl restart sshdmit at/cron/systemdTimern
    • Starten Sie den Computer SSHmit einer anderen (sicheren) Remote-Shell neu, zmosh
  • Das Ausführen screen/tmuxblockiert möglicherweise auch den SSHNeustart von Diensten. Am einfachsten ist es, diese Sitzungen vor dem Neustart von Diensten zu schließen
  • Wie bereits in einer früheren Antwort erwähnt, ist möglicherweise eine Abmeldung / Anmeldung erforderlich, insbesondere für grafische Sitzungen

1
Würde es Ihnen etwas ausmachen, die Antwort dahingehend zu verbessern, wie Kexec verwendet wird?
Rui F Ribeiro

0

Eine 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.