shutdown 支持计划关机和取消,systemctl poweroff/reboot/halt 即停即走;远程 SSH 执行一样。以下均经 WSL2 实测。
草稿待审 — WSL2 中 systemctl poweroff 未实际执行,终止实例的风险基于文档和命令结构推断。
一、TL;DR:按场景选命令
- 计划关机并通知在线用户:
shutdown +10 "维护",10 分钟后自动关机。 - 立即关机:
systemctl poweroff,无延迟,等所有进程退出后断电。 - 立即重启:
systemctl reboot。 - 仅停机不断电:
systemctl halt。 - 远程操作:SSH 登录后执行上述任意一条,效果等同于本地。
二、shutdown:计划关机首选
shutdown +10 "系统维护"
shutdown --poweroff now
shutdown --halt +5
shutdown -c
shutdown 接受时间参数:hh:mm(24 小时制)或 +m(m 分钟后),now 即 +0 立即执行。默认 +1 分钟;不指定时间且不带 -k 时,5 分钟后会写入 /run/nologin 阻止新登录 [1]。附加的字符串会通过 wall 广播给所有在线用户。
-k 选项只发警告、不真的关机,适合测试通知逻辑。本机实测:
Shutdown scheduled for Mon 2026-11-02 16:09:52 CST, use 'shutdown -c' to cancel.
-c 取消待执行的关机任务。
三、systemctl 系:即停即走
systemctl poweroff
systemctl reboot
systemctl halt
这三个动词是 systemd 的首选接口。底层分别拉入 poweroff.target、reboot.target、halt.target,由 systemd-poweroff.service 等实际执行卸载、关闭 swap、清理设备、杀进程 [3][4]。与旧版 halt -p 的兼容差异不再需要关心,systemd 255 统一处理 [2]。
--no-block 可让 systemctl 不等关机完成就返回,适合远程脚本。
四、远程通过 SSH 关闭
ssh root@server 'systemctl poweroff'
ssh root@server 'shutdown -P now "远程维护"'
远程关闭和本地没有本质区别,核心依赖是 SSH 登录权限。大站运维手册推荐:先 shutdown -k 干跑一次,确认命令解析无误;再执行真实关机。单条 SSH 命令里要小心引号嵌套,推荐把整个 Linux 命令包在单引号里。
五、按环境差异
| 环境 | shutdown | systemctl | 远程 SSH |
|---|---|---|---|
| 物理机 x86_64 | 正常 | 正常 | 正常 |
| WSL2 | poweroff 会终止 WSL 实例 |
同上 | 通过 wsl.exe -d ... 模拟 |
| 容器 | 通常无 systemd(PID 1 非 systemd),systemctl 报错 |
同上 | 取决于容器内 init 系统 |
六、回滚、排错与局限性
排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
shutdown: command not found |
最小安装未装 sysvinit-utils | apt install sysvinit-utils |
systemctl: command not found |
非 systemd 系统(OpenRC、runit 等) | 改用对应 init 系统的 halt 命令 |
Failed to power off system via logind: Access denied |
没有 PolicyKit 权限 | 以 root 执行,或配置 polkit 规则 |
| 远程 SSH 执行无反应 | SELinux/AppArmor 阻断 SSH 命令 | 检查 audit.log 或 dmesg |
局限性
- WSL2 里执行
poweroff会终止整个 WSL 实例,不能像物理机那样再次唤醒。 - 容器中 PID 1 通常不是 systemd,
systemctl报错;应先确认PID 1。 shutdown -f或systemctl --force poweroff会绕过正常卸载流程,强制断电,文件系统损坏风险高,仅作最后手段。
实测记录
- 环境:WSL2 Ubuntu 24.04,systemd 255 (255.4-1ubuntu8.16),内核 5.15。
shutdown --help:输出完整,含-H/-P/-r/-k/-c。shutdown -k +10 "WSL 测试停止":成功写入计划,输出 “Shutdown scheduled…”。shutdown -c:成功取消,exit 0。systemctl list-unit-files | grep -E "poweroff|reboot|halt":全部 static;is-enabled为 disabled,符合 systemd 静态 target 设计。systemctl cat poweroff.target:输出正确,Requires=systemd-poweroff.service。
参考资料
- [1] shutdown(8) – Linux manual page (man7.org)(shutdown(8))
- [2] poweroff(8) – Linux manual page (man7.org)(poweroff(8))
- [3] systemd.special(7) – Linux manual page (man7.org)(systemd.special(7))
- [4] systemd-poweroff.service(8) – Linux manual page (man7.org)(systemd-poweroff.service(8))
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。