після бігу
sudo pacman -Syyu
або
sudo pacman -S [something to install]
я повинен перезапуститись лише для безпечності?
після бігу
sudo pacman -Syyu
або
sudo pacman -S [something to install]
я повинен перезапуститись лише для безпечності?
Відповіді:
Найкращий спосіб - знайти, які програми / послуги використовують старі бібліотеки, і перезапустити їх. І ви можете досягти цього, перерахувавши всі використовувані файли за допомогою 'lsof' і знайти ті, які мають тип 'DEL'. DEL означає, що ім’я файлу було видалено з файлової системи, але воно все ще залишається в пам'яті, оскільки хтось ним користується.
Ось повний командний рядок:
sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
Єдина обов'язкова причина для перезавантаження - це нове ядро (і його можна перезавантажити, використовуючи 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
слід виконати до перезавантаження чого-небудь іншогоsystemd
сам) потрібно перезапустити, це можна зробити за допомогоюsystemctl daemon-reexec
systemctl restart dbus.service
порушує деякі інші послуги, їх потрібно перезапустити після перезавантаження dbus:
systemd
себе: systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
не буде перезапустити його, поки ви підключені, я бачу два варіанти:
systemctl restart sshd
використання at/cron/systemd
таймерівSSH
за допомогою іншої віддаленої (захищеної) оболонки, наприкладmosh
screen/tmux
може також заблокувати такі послуги, як SSH
перезавантаження, найпростіший спосіб - це закрити ці сеанси перед перезапуском службПростий спосіб - порівняти версію запущеного ядра з останнім ядром на диску. Я знайшов сценарій , який легко зробити це.
Оскільки у мене встановлено кілька ядер, я змінив сценарій, щоб перевірити лише те, що відповідає ядра, що працює. Наприклад, у мене зараз встановлені версії 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