![pacman 升级后我应该重新启动吗?](https://linux22.com/image/31855/pacman%20%E5%8D%87%E7%BA%A7%E5%90%8E%E6%88%91%E5%BA%94%E8%AF%A5%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E5%90%97%EF%BC%9F.png)
跑步后
sudo pacman -Syyu
或者
sudo pacman -S [something to install]
为了安全起见我应该重新启动吗?
答案1
最好的方法是找到哪些程序/服务使用旧库并重新启动它们。您可以通过使用“lsof”列出所有使用的文件并查找具有“DEL”类型的文件来实现此目的。 DEL 表示文件名已从文件系统中删除,但由于有人使用它,它仍然卡在内存中。
这是完整的命令行:
sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
答案2
如果内核、glibc 或 systemd 有更新,您可能需要重新启动以便使用更新的版本。例如,如果您更新了桌面环境,则简单的注销/登录就足够了。
答案3
重新启动的唯一强制原因是新内核(您可以使用 kexec 进行软重新启动)。看https://wiki.archlinux.org/index.php/Kexec详细信息,简而言之:
加载新内核、initramfs 并指定启动命令行
kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
invoke
kexec
(用于systemctl
正确关闭,kexec -e
将直接执行)systemctl kexec
请注意,如果您
[email protected]
按照 wiki 中的说明创建了一个,如果您重新启动,systemd
将使用自动软重新启动,kexec
而不是执行 BIOS 重新启动
稍微改进的版本提供了 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
或一行:
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
只要连接就不会重新启动它,我会看到 2 个选项:systemctl restart sshd
使用at/cron/systemd
计时器进行安排- 使用另一个远程(安全)shell重新启动
SSH
,例如mosh
- 正在运行的进程
screen/tmux
也可能阻止服务SSH
重新启动,最简单的方法是在重新启动服务之前关闭这些会话 - 正如之前的答案所述,可能需要注销/登录,特别是对于图形会话
答案4
一种简单的方法是将正在运行的内核的版本与磁盘上的最新内核进行比较。我找到了一个脚本可以轻松做到这一点。
由于我安装了多个内核,因此我修改了脚本以仅检查与正在运行的内核对应的内核。例如,我当前安装了版本 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