Devo riavviare dopo un aggiornamento di pacman?


Risposte:


10

Se ci sono aggiornamenti per kernel, glibc o systemd, potresti voler riavviare in modo che le versioni aggiornate siano in uso. Se hai, diciamo, aggiornamenti per il tuo ambiente desktop, è sufficiente un semplice logout / login.


11

Il modo migliore è trovare quali programmi / servizi utilizzano le vecchie librerie e riavviarle. E puoi ottenerlo elencando tutti i file usati usando 'lsof' e trovare quelli che hanno il tipo 'DEL'. DEL significa che il nome file è stato rimosso dal filesystem ma è ancora bloccato in memoria perché qualcuno lo utilizza.

Ecco la riga di comando completa:

 sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u

2
Dopo aver generato tale elenco di servizi e librerie, non è ancora chiaro quali servizi di sistema debbano essere riavviati. Quindi, anche se so quali processi e librerie necessitano di un riavvio, in genere non è banale determinare quali servizi riavviare in base a tale elenco.
bwv549,

6

L'unico motivo obbligatorio per riavviare è un nuovo kernel (e puoi riavviare il sistema usando kexec). Vedi https://wiki.archlinux.org/index.php/Kexec per i dettagli, in breve:

  • carica il nuovo kernel, initramfs e specifica il cmdline di avvio

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
  • invoke kexec(utilizzare systemctlper l'arresto corretto, kexec -eeseguirà direttamente)

    systemctl kexec
    
  • Si noti che se si crea un kexec-load@.servicecome spiegato nel wiki, se si riavvia, il riavvio systemdautomatico verrà kexeceseguito automaticamente utilizzando invece di eseguire un riavvio del BIOS

Versione leggermente migliorata che fornisce nomi di servizi 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

o una riga:

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

Si noti che ci sono alcuni problemi:

  • systemctl daemon-reload dovrebbe essere eseguito prima di riavviare qualsiasi altra cosa
  • se è systemdnecessario riavviare PID 1 ( stesso), è possibile farlo utilizzandosystemctl daemon-reexec
  • systemctl restart dbus.service interrompe alcuni altri servizi, devono essere riavviati dopo il riavvio del dbus:
    • systemd si: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • probabilmente altri systemd - * / altri servizi che (pesantemente) usano dbus
  • Se sei connesso tramite SSH e SSH deve essere riavviato, ma systemctl restart sshdnon lo riavvierà finché sarai connesso, vedo 2 opzioni:
    • programmare systemctl restart sshdusando i at/cron/systemdtimer
    • riavviare SSHutilizzando un'altra shell remota (sicura) comemosh
  • l'esecuzione screen/tmuxpuò anche bloccare servizi come il SSHriavvio, il modo più semplice è chiudere queste sessioni prima di riavviare i servizi
  • come detto in una risposta precedente, potrebbe essere necessario il logout / login, specialmente per le sessioni grafiche

1
ti dispiacerebbe migliorare la risposta spiegando come viene usato kexec?
Rui F Ribeiro,

0

Un modo semplice è confrontare la versione del kernel in esecuzione con l'ultimo kernel su disco. Ho trovato una sceneggiatura che può farlo facilmente.

Dato che ho installato diversi kernel, ho modificato lo script per controllare solo quello corrispondente al kernel in esecuzione. Ad esempio, al momento ho installato le versioni 4.9.79 e 4.14.16 e quindi ho bisogno di controllare /boot/vmlinuz-4.14-x86_64. Sfortunatamente questo non funzionerà quando inizio a utilizzare la versione 5.1, quindi sarà necessario un aggiornamento (sostituire 4 per 3) o devo trovare un modo più affidabile.

Ecco la mia sceneggiatura:

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.