Чи варто перезапустити після оновлення пакета?


Відповіді:


10

Якщо є оновлення ядра, glibc або systemd, можливо, ви захочете перезапустити, щоб використовувались оновлені версії. Якщо у вас є, скажімо, оновлення для вашого робочого середовища, достатньо простого виходу / входу.


11

Найкращий спосіб - знайти, які програми / послуги використовують старі бібліотеки, і перезапустити їх. І ви можете досягти цього, перерахувавши всі використовувані файли за допомогою 'lsof' і знайти ті, які мають тип 'DEL'. DEL означає, що ім’я файлу було видалено з файлової системи, але воно все ще залишається в пам'яті, оскільки хтось ним користується.

Ось повний командний рядок:

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

2
Після створення цього списку служб та бібліотек, досі не зрозуміло, які системні служби потрібно перезапустити. Отже, незважаючи на те, що я знаю, для яких процесів та файлів потрібен перезапуск, зазвичай визначати, які послуги потрібно перезапустити, базуючись на цьому списку, зазвичай нетривіально.
bwv549

6

Єдина обов'язкова причина для перезавантаження - це нове ядро ​​(і його можна перезавантажити, використовуючи kexec). Детальніше дивіться на https://wiki.archlinux.org/index.php/Kexec , коротко:

  • завантажте нове ядро, initramfs та вкажіть cmdline завантажувача

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
  • викликати kexec(використовувати systemctlдля правильного відключення, kexec -eвиконується безпосередньо)

    systemctl kexec
    
  • Зауважте, що якщо ви створите так, kexec-load@.serviceяк пояснено у вікі, якщо ви перезавантажуєтеся, systemdвін автоматично перезавантажиться, використовуючи kexecзамість того, щоб перезавантажувати bios

Трохи вдосконалена версія, яка дає імена системних служб:

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

або однорядковий:

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

Зауважте, що є деякі проблеми:

  • systemctl daemon-reload слід виконати до перезавантаження чого-небудь іншого
  • якщо PID 1 ( systemdсам) потрібно перезапустити, це можна зробити за допомогоюsystemctl daemon-reexec
  • systemctl restart dbus.service порушує деякі інші послуги, їх потрібно перезапустити після перезавантаження dbus:
    • systemd себе: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • ймовірно, інші systemd - * / інші сервіси, які (сильно) використовують dbus
  • Якщо ви підключені через SSH і SSH потрібно перезапустити, але systemctl restart sshdне буде перезапустити його, поки ви підключені, я бачу два варіанти:
    • графік systemctl restart sshdвикористання at/cron/systemdтаймерів
    • перезавантажте SSHза допомогою іншої віддаленої (захищеної) оболонки, наприкладmosh
  • Запуск screen/tmuxможе також заблокувати такі послуги, як SSHперезавантаження, найпростіший спосіб - це закрити ці сеанси перед перезапуском служб
  • Як сказано в попередній відповіді, вихід / вхід може знадобитися, особливо для графічних сесій

1
Ви б не хотіли покращити відповідь, пояснюючи, як застосовується kexec?
Rui F Ribeiro

0

Простий спосіб - порівняти версію запущеного ядра з останнім ядром на диску. Я знайшов сценарій , який легко зробити це.

Оскільки у мене встановлено кілька ядер, я змінив сценарій, щоб перевірити лише те, що відповідає ядра, що працює. Наприклад, у мене зараз встановлені версії 4.9.79 та 4.14.16, і тому мені потрібно перевірити /boot/vmlinuz-4.14-x86_64. На жаль, це не спрацює, коли я розпочну використовувати версію 5.1, тому знадобиться оновлення (замініть 4 на 3) або мені потрібно знайти більш надійний спосіб.

Ось мій сценарій:

#!/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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.