RDP Monster

Linux 重启命令:reboot、shutdown -r now 与 systemctl reboot

Linux 重启命令:reboot、shutdown -r now 与 systemctl reboot

Linux 重启命令:reboot、shutdown -r now 与 systemctl reboot

在当前任何发行版上,下面三条命令重启机器的方式完全一致。请以 root 身份或通过 sudo 执行;通过 SSH 使用非特权账户会得到 Failed to reboot system via logind: Interactive authentication required。

sudo reboot
sudo shutdown -r now
sudo systemctl reboot

这并不是三套不同的实现。在 systemd 发行版上,/sbin/reboot、/sbin/shutdown、/sbin/halt 和 /sbin/poweroff 都是指向 systemctl 的符号链接,systemctl 会根据被调用的名字切换到相应的兼容模式;ls -l $(which reboot) 可以看到该链接。无论你输入哪一种写法,systemd 都会启动 reboot.target,按依赖关系的逆序停止所有单元,卸载文件系统并请求内核重启。通过 SSH 连接会在一两秒内断开;机器离线多久取决于内核、可能的文件系统检查以及服务商的引导流程,因此至少等一分钟再判断是否出了问题。

关机:shutdown -h now、poweroff、halt 以及传统的 init 6

要给机器关机,下面任意一条即可:

sudo shutdown -h now
sudo poweroff          # identical to: sudo systemctl poweroff

在 systemd 下,-h 的含义是"停机或关机,以默认行为为准",而默认行为就是关机,因此 shutdown -h now 与 shutdown -P now 完全相同。真正容易踩坑的是单独的 halt:它会停止操作系统,却不发出关机请求,于是虚拟机停在 System halted,资源仍被占用、仍在计费,直到你从面板里停止它。请改用 halt -p、poweroff 或 shutdown -h now。

SysV 风格的写法仍然可用,因为 systemd 把运行级别映射到了 target:init 6 和 telinit 6 对应 reboot.target,init 0 对应 poweroff.target。它们出现在旧脚本里无伤大雅,但没有 wall 广播、不能定时、也不会在 journal 中留下说明,所以没必要手动输入。

命令效果说明
reboot重启等同于 systemctl reboot
shutdown -r now重启可指定时间和 wall 广播消息
systemctl reboot重启支持 --message= 和 --force
shutdown -h now / poweroff关机-h 在 systemd 下等同于 -P
halt停止操作系统,电源仍开启用 halt -p 才能关机
init 6 / telinit 6重启传统写法,映射到 reboot.target
init 0关机传统写法,映射到 poweroff.target
shutdown -c取消已排定的关机用户会收到取消通知
shutdown -k仅发送 wall 广播消息实际上不会关机

定时重启、取消重启以及提醒已登录用户

sudo shutdown -r +10 "Kernel update, back in about two minutes"
sudo shutdown -r 02:30
sudo shutdown -c

时间参数可以是 now、表示 m 分钟后的 +m,或 24 小时制的 hh:mm(今天已过的时间点表示明天)。完全不写时间时,shutdown 默认取 +1:单独的 sudo shutdown 会在六十秒后关机。时间参数之后的内容会作为 wall 消息广播到每个已登录终端,临近时间点时 logind 还会重复提醒;--no-wall 可以让它保持安静,shutdown -k 则只发提醒而不排定任何操作。到点前五分钟,logind 会创建 /run/nologin,此后新的登录都会被拒绝。

shutdown -c 会取消待执行的操作、删除 /run/nologin,并告知已登录用户关机已取消。要检查是否有待执行的计划,可查看 /run/systemd/shutdown/scheduled:它只在有关机排队时存在,并记录模式和目标时间。较新的 systemd 版本还支持 systemctl reboot --when=+10m,以及 --when=show 和 --when=cancel(可用 systemctl --help 确认;旧版本没有该选项)。

重启期间服务和 SSH 会话会发生什么

当 reboot.target 被请求时,systemd 会停止与之冲突的一切,也就是几乎所有单元。服务按依赖关系的逆序停止:每个服务先执行自己的 ExecStop 或收到 SIGTERM,如果在 TimeoutStopSec(默认 90 秒,来自 /etc/systemd/system.conf 中的 DefaultTimeoutStopSec=)之后仍未退出,就会收到 SIGKILL。控制台上看到的 A stop job is running for ... 倒计时正是这个超时;通常是某个忽略 SIGTERM 的守护进程,或仍在刷盘的数据库。随后文件系统被卸载或以只读方式重新挂载,内核开始重启。你不需要事先执行 sync。

你的 SSH 会话不会被特殊对待。ssh.service 停止,承载你登录的 scope 收到 SIGTERM,你的 shell 结束,客户端打印 Connection to 203.0.113.10 closed by remote host。tmux 或 screen 只能防止连接中断带来的影响,防不了重启:其中运行的一切同样会消失。

重启后能恢复什么,取决于是否设置了开机自启,而不是重启前正在运行什么。标记为 enabled 的单元会重新启动;用 systemctl start 手动启动的服务、nohup 进程或没有重启策略的 Docker 容器则不会。重启前运行 systemctl list-unit-files --state=enabled,重启后运行 systemctl --failed;用 systemctl 列出和筛选服务的指南说明了如何解读这两条命令的输出。

安全重启 VPS:起飞前检查清单

VPS 没有物理访问途径,因此一次没能重新启动成功的重启,就意味着要绕道服务商控制台。下面五项检查总共不到一分钟,却几乎能避免所有这类麻烦。

1. 确认确实需要重启

并非每次更新都需要重启。在 Ubuntu 上,当某个软件包要求重启时会出现 /var/run/reboot-required,而 /var/run/reboot-required.pkgs 会列出是哪些包;Debian 和 Ubuntu 上的 needrestart,以及 RHEL 系中来自 dnf-utils 的 needs-restarting -r,可以做同样的检查。新内核、glibc 或 systemd 值得重启;只是打了补丁的 nginx 只需 systemctl restart nginx。先装完待处理的更新,这样只需重启一次而不是两次;用命令行更新 Ubuntu 的教程介绍了 apt 的操作顺序和 reboot-required 标记。

[ -f /var/run/reboot-required ] && cat /var/run/reboot-required.pkgs
uname -r; ls /boot/vmlinuz-*     # running kernel vs. newest installed

2. 确认没有正在写入的操作

打断包管理器是把系统弄成半配置状态的最快方式,而中途被终止的备份,日后很容易被误当成完好的副本。先找出这类进程,并看看还有谁登录着:

pgrep -a 'apt|dpkg|dnf|yum|unattended'
pgrep -a 'rsync|mysqldump|pg_dump|restic|borg'
w

3. 校验必须挺过重启的配置

有三个文件能把一次例行重启变成把自己锁在门外。sshd_config 里的语法错误会让 sshd 无法启动,你也就进不去了:文件有效时 sudo sshd -t 不会输出任何内容,如果你最近加固过 SSH 守护进程,现在就跑一遍。/etc/fstab 中指向已不存在设备的条目,若没有 nofail,会让系统启动进入紧急模式;sudo findmnt --verify 能发现大部分此类问题。/boot 占满可能留下装了一半的内核,所以要检查它的剩余空间。直接用 iptables 或 nft 写下、却从未保存的防火墙规则会在重启后消失;UFW 和 firewalld 的规则则会持久保留。

sudo sshd -t
sudo findmnt --verify
df -h / /boot

4. 记录一份基线

systemctl --failed
systemctl list-units --type=service --state=running > ~/services-before.txt

5. 重启,然后验证

sudo systemctl reboot --message="post-update reboot"
# after reconnecting:
uptime -s; systemctl --failed
systemctl list-units --type=service --state=running | diff ~/services-before.txt -

uname -r 与预期一致、systemctl --failed 没有报错、diff 为空,就说明这次重启一切正常。

重启卡住时:如何强制重启,以及何时改用服务商控制台

如果 reboot 已经返回但机器迟迟不关,说明有停止作业卡住了;systemctl list-jobs 能看出是哪一个。systemctl reboot --force 会跳过有序的单元停止流程:进程被直接杀掉,但文件系统仍会卸载,所以虽然粗暴,还算相对安全。--force --force 会立即重启且不卸载任何东西,可能丢数据;把它当成直接拔电源看待。当 systemd 本身都不再响应时,内核的 SysRq 接口是最后手段。无论 kernel.sysrq 这个 sysctl 如何设置,root 总是可以写入 /proc/sysrq-trigger,但重定向本身必须以 root 身份执行,因此请使用 root shell 或 sudo sh -c:

echo s > /proc/sysrq-trigger   # sync dirty buffers
echo u > /proc/sysrq-trigger   # remount filesystems read-only
echo b > /proc/sysrq-trigger   # reboot right now

当虚拟机自身已无力回天时,就该用服务商的面板或控制台了:改动网络或防火墙后 SSH 不可达、内核启动时 panic、fstab 有错导致进入紧急模式提示符、忘记 root 密码。面板中的 Reboot 或 Shutdown 通常会发送一个 ACPI 电源事件,由虚拟机通过 logind 处理(logind.conf 中的 HandlePowerKey=),因此服务仍会干净地停止。Reset、Force stop 或 Power cycle 则毫无预警地切断虚拟电源:下次启动时文件系统日志会重放,但尚未写入的数据都会丢失。VNC 或串口控制台能让你看到 GRUB、内核消息以及紧急 shell,这些是 SSH 永远看不到的。

查看运行时长与上次重启时间

uptime -p                      # up 3 days, 4 hours, 12 minutes
uptime -s                      # 2026-08-31 02:31:07
who -b                         # system boot  2026-08-31 02:31
last -x reboot shutdown | head
journalctl --list-boots

uptime -s 和 who -b 会直接打印启动时间。last -x 读取 /var/log/wtmp,同时列出 reboot 和 shutdown 记录:某条 reboot 之前没有对应的 shutdown,说明机器上次是非正常关机(panic 或硬重置)。journalctl --list-boots 会给 journal 已知的每次启动编号,0 是当前这次,-1 是上一次;journalctl -b -1 -e 则显示上次关机前的最后几行日志,停止作业超时或内存不足被杀的痕迹就留在那里。如果只列出当前这次启动,说明 journal 是易失的:创建 /var/log/journal 并重启 systemd-journald。

上面所有命令都基于一个前提:当虚拟机拒绝重新启动时,你仍然能够触达它。带控制台访问的 KVM Linux VPS 正好提供这一点:一台拥有独立内核、专用 CPU 与内存、完整 root 权限的真正虚拟机,并在 SSH 无能为力时提供控制台。rdp.monster 在付款确认后约 10 秒交付,带宽无限制(合理使用),无需 KYC,支持银行卡与加密货币付款,每月 $8.99 起。

常见问题

reboot 和 shutdown -r now 有什么区别?

在 systemd 系统上没有实质区别:两者最终都会执行 systemctl reboot。
两条命令都是指向 systemctl 的符号链接,都会请求 reboot.target,因此服务停止顺序相同,磁盘卸载方式也一样。区别在于它们接受的参数:shutdown 可以带时间参数(+5、02:30)和给已登录用户的 wall 消息,而 reboot 总是立即执行。systemctl reboot 额外提供写入 journal 的 --message=,以及应对卡死系统的 --force。按场景选择即可;结果完全一致。

通过 SSH 执行 reboot 安全吗?

安全。sshd 停止时连接会断开,但重启会在没有你的情况下继续完成。
重启由 systemd 处理,而不是由你的 shell 处理,所以中途丢失 SSH 会话并不会打断它。你会在几秒内看到 Connection closed by remote host,机器恢复后即可重新连接。真正不安全的是:在软件包安装、备份或数据库导出仍在运行时重启,或者改完 sshd_config 却没用 sudo sshd -t 检查就重启;这些情况会让机器回来后你根本登不上去。

不用 sudo 怎么重启 Linux?

通过 SSH 做不到;polkit 只可能允许在本地控制台登录的用户这样做。
systemd 会向 polkit 询问调用者是否有权重启。默认规则允许拥有活动本地会话、且没有其他用户登录的用户执行,这就是笔记本上 reboot 无需密码的原因。远程 SSH 会话不算本地座位,因此在服务器上该命令会以 Interactive authentication required 失败。请使用 sudo reboot;若想要一个免密码但范围很窄的权限,可在 sudoers 中为该账户添加仅限 /usr/bin/systemctl reboot 的规则。

重启 Linux 前需要先执行 sync 吗?

不需要。正常重启会在内核重启前刷盘并卸载所有文件系统。
reboot、shutdown 和 systemctl reboot 都会走 systemd 的关机流程:停止服务、把脏缓冲区刷盘、卸载文件系统或以只读方式重新挂载,然后才把控制权交给内核。事先执行 sync 无害,但多余。只有在跳过该流程的场景下才需要:systemctl reboot --force --force、从服务商面板执行硬重置,或 echo b > /proc/sysrq-trigger。此时推荐的顺序是先 s(sync),再 u(只读重挂),最后 b。

Adrien Roche, 基础设施与主机托管编辑

系统工程师,拥有 10 年以上运维 Windows Server 和 Linux 集群的经验。Adrien 负责 rdp.monster 的基础设施文档,并撰写关于 RDP、VPS 托管、服务器管理、网络和隐私工具的指南。

注册加入我们的分销商计划

您的信息

如有任何疑问, 点击这里联系我们 !
姓名(必填)
请填写您的邮箱地址,您必须拥有以下网站的账号: dashboard.rdp.monster !

您的公司

如果您有网站,请填写网址
请简要说明您打算如何向客户销售服务,例如在论坛上与人交流推广。

连怪兽都爱吃 cookie!

我们使用 cookie 来改善您的浏览体验、提供个性化的广告或内容,并分析网站流量。点击「接受」即表示您同意我们使用 cookie。