Answers:
重启的唯一强制原因是新内核(您可以使用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
按照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
应该在重新启动其他任何东西之前执行systemd
本身)需要重新启动,则可以使用systemctl daemon-reexec
systemctl restart dbus.service
中断了一些其他服务,需要在dbus重新启动后重新启动它们:
systemd
本身: systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
只要您已连接就不会重新启动它,我会看到2个选项:
systemctl restart sshd
使用at/cron/systemd
计时器安排时间SSH
使用另一个远程(安全)shell 重新启动,例如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