pacman 升级后我应该重新启动吗?

aht*_*rix 18 drivers arch-linux pacman package-management

跑完后

sudo pacman -Syyu
Run Code Online (Sandbox Code Playgroud)

或者

sudo pacman -S [something to install]
Run Code Online (Sandbox Code Playgroud)

为了安全起见,我应该重新启动吗?

sch*_*iba 11

如果内核、glibc 或 systemd 有更新,您可能需要重新启动以便使用更新的版本。如果您有桌面环境的更新,那么简单的注销/登录就足够了。


小智 11

最好的方法是找到哪些程序/服务使用旧库并重新启动它们。您可以通过使用“lsof”列出所有使用过的文件并找到具有“DEL”类型的文件来实现它。DEL 表示文件名已从文件系统中删除,但由于有人使用它,它仍停留在内存中。

这是完整的命令行:

 sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
Run Code Online (Sandbox Code Playgroud)

  • 生成服务和库列表后,仍然不清楚哪些 systemd 服务需要重新启动。因此,即使我知道哪些进程和库需要重新启动,根据该列表确定要重新启动的服务通常并不容易。 (2认同)

小智 8

重新启动的唯一强制原因是新内核(您可以使用 kexec 软重新启动)。有关详细信息,请参阅https://wiki.archlinux.org/index.php/Kexec,简而言之:

  • 加载新内核 initramfs 并指定启动 cmdline

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
    Run Code Online (Sandbox Code Playgroud)
  • invoke kexec(systemctl用于正确关闭,kexec -e将直接执行)

    systemctl kexec
    
    Run Code Online (Sandbox Code Playgroud)
  • 请注意,如果您kexec-load@.service按照 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
Run Code Online (Sandbox Code Playgroud)

或单行:

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
Run Code Online (Sandbox Code Playgroud)

请注意,有一些问题:

  • 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定时器进行调度
    • SSH使用另一个远程(安全)shell重新启动,例如mosh
  • 运行screen/tmux也可能会阻止服务SSH重启,最简单的方法是在重启服务之前关闭这些会话
  • 如之前的答案所述,可能需要注销/登录,尤其是对于图形会话