shutdown命令最适合单次定时关机,需sudo权限、正确时间格式及可选警告消息;每日定时关机必须用root crontab调用绝对路径/sbin/shutdown;安全关机应通过带进程检查和sync的脚本实现。

直接用 shutdown 命令设置单次定时关机
如果你只需要今晚或某天一次关机,shutdown 是最简单、最可靠的选择,不用编辑配置、不依赖后台服务。它原生支持时间格式和延迟模式,且自带用户通知机制。
常见错误是写错时间格式或漏掉 sudo 权限——shutdown 必须以 root 身份运行,否则会报错 Failed to set wall message: Permission denied 或静默失败。
-
sudo shutdown 23:00:今天 23:00 关机(24 小时制,注意不要写成11:00 PM) -
sudo shutdown +30:30 分钟后关机(适合下载完成、渲染结束等场景) -
sudo shutdown -c:取消已设定的关机计划(必须在倒计时结束前执行) - 警告消息可选但推荐加:
sudo shutdown 23:00 "系统即将关机,请保存工作"
注意:shutdown 默认使用 --poweroff(即彻底断电),不是休眠或挂起;如果误用 -h 参数又没加 sudo,命令可能看似执行成功但实际无效。
每天固定时间关机,必须用 cron 并写进 root 的 crontab
用户级 crontab -e 无法执行 /sbin/shutdown,因为权限不足——cron 不会自动提升权限,也不会读取你的 sudo 配置。所以必须编辑 root 的 crontab,否则任务会静默失败,syslog 里只留下一条 Permission denied 记录。
正确做法是:
- 运行
sudo crontab -e(不是crontab -e) - 添加行:
0 23 * * * /sbin/shutdown -h now(每天 23:00 关机) - 保存后用
sudo crontab -l确认是否生效 - 绝对路径很重要:
/sbin/shutdown不能简写成shutdown,因为 cron 的$PATH很窄
别用图形界面“电源设置”里的自动关机选项——Ubuntu 22.04+ 已移除该功能,Deepin 或旧版 GNOME 可能还有,但底层不调用 shutdown,而是依赖 upower,行为不稳定,且无法设置精确到分钟的计划。
想加安全检查?写个脚本再交给 cron
直接关机有风险:比如数据库正在写入、Docker 容器没停、编译进程卡住。这时候硬关机会丢数据。一个带检查的脚本比裸 shutdown 更靠谱。
Ubuntu 26.04 LTS(代号“Resolute Raccoon”)是Canonical于2026年4月23日发布的下一代长期支持版操作系统,提供长达10年的技术支持。它搭载Linux 7.0内核与GNOME 50桌面环境,全面转向Wayland协议,并引入Rust重写的核心工具以增强安全性。官方提供适用于AMD64和ARM64架构的桌面及服务器ISO镜像,是追求前沿技术与极致稳定的开发者
示例脚本 /usr/local/sbin/safe_shutdown:
#!/bin/bash if pgrep -x "mysqld" >/dev/null; then logger "safe_shutdown: mysqld running, aborting" exit 1 fi sync && sync /sbin/shutdown -h +2 "系统将在2分钟后关机"
关键点:
- 脚本需设为可执行:
sudo chmod 755 /usr/local/sbin/safe_shutdown - cron 里调用它:
0 23 * * * /usr/local/sbin/safe_shutdown -
pgrep检查进程名要准确(如mysqld不是mysql) - 两次
sync是为了确保缓存刷入磁盘,尤其对 SSD 或 USB 存储更必要
别把脚本放在 ~/ 下——cron 执行时不会加载你的用户环境变量,~ 可能解析失败,路径必须绝对。
at 命令适合一次性、非规律性关机
at 和 shutdown 类似,但更适合“今晚 23:00 关机”这种临时需求,而且它天然支持 root 权限(只要你是 sudo 用户),不需要额外提权。
但它有个隐藏限制:默认 Ubuntu 安装不带 atd 服务,得先启用:
sudo systemctl enable --now atdecho "/sbin/shutdown -h now" | at 23:00- 查看待执行任务:
atq;取消任务:atrm
at 不适合每天重复——它只执行一次,且任务存储在 /var/spool/at/,重启后仍存在,但没人维护它的长期可靠性。cron 才是“每天”的唯一正解。
真正容易被忽略的是:所有方案都依赖系统时间准确。如果你的 Ubuntu 虚拟机没开 NTP 同步,或者 BIOS 时间漂移严重,23:00 可能变成 22:58 或 23:03——建议先确认 timedatectl status 显示 System clock synchronized: yes。










