Dois-je redémarrer après une mise à niveau de pacman?


Réponses:


10

S'il existe des mises à jour du noyau, de la glibc ou de systemd, vous souhaiterez peut-être redémarrer afin que les versions mises à jour soient utilisées. Si vous avez, par exemple, des mises à jour de votre environnement de bureau, une simple déconnexion / connexion suffit.


11

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

2
Après avoir généré cette liste de services et de bibliothèques, il n'est toujours pas clair quels services systemd doivent être redémarrés. Par conséquent, même si je sais quels processus et bibliothèques ont besoin d'un redémarrage, il n'est généralement pas trivial de déterminer les services à redémarrer en fonction de cette liste.
bwv549

6

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 chose
  • si PID 1 ( systemdlui-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
    • probablement d'autres systemd - * / autres services qui utilisent (fortement) dbus
  • Si vous êtes connecté via SSH et que SSH doit être redémarré, mais systemctl restart sshdne le redémarrera pas tant que vous serez connecté, je vois 2 options:
    • planifier à l' systemctl restart sshdaide de at/cron/systemdminuteries
    • redémarrer à l' SSHaide d'un autre shell distant (sécurisé) tel quemosh
  • l'exécution screen/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 services
  • comme indiqué dans une réponse précédente, la déconnexion / connexion peut être nécessaire, en particulier pour les sessions graphiques

1
Pourriez-vous améliorer la réponse en expliquant comment kexec est utilisé?
Rui F Ribeiro

0

Un 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.