shutdown -h 22:30可实现当天22:30单次关机,需root或sudo权限;该命令不持久、不跨重启,误设须用sudo shutdown -c取消,Ctrl+C无效。

能直接用 shutdown -h 22:30 设置具体时间关机,但必须是 root 或有 sudo 权限,且该命令只生效一次、不持久、不跨重启。
用 shutdown 指定绝对时间关机(如 22:30)
这是最直觉的操作,适合临时安排某天某个时刻关机,比如今晚会议结束前关机。
sudo shutdown -h 22:30:当天 22:30 关机;如果已过 22:30,则默认推迟到次日同一时间- 普通用户执行会报错:
Failed to set reboot delay: Permission denied,必须用sudo或切换到 root - 终端不会阻塞,命令提交后立即返回提示,关机计划由 init 系统接管,不受终端关闭影响
- 误设后只能用
sudo shutdown -c取消;Ctrl+C无效,因为进程已交由系统管理 - 不能写成
shutdown -h 22:30:00—— 秒字段会被忽略,部分发行版甚至直接报错
用 cron 实现每天固定时间关机(如每天 2:00)
如果你要的是「每天凌晨 2 点自动关机」,shutdown 单次命令做不到,必须靠 cron 定期触发。
- 编辑 root 的 crontab:
sudo crontab -e,普通用户的crontab无权调用/sbin/shutdown - 写入行:
0 2 * * * /sbin/shutdown -h +0—— 注意必须用绝对路径/sbin/shutdown,不能只写shutdown - 别用
now:/sbin/shutdown -h now在 cron 环境中可能因 PATH 缺失失败;+0更可靠 - 加日志重定向更安心:
0 2 * * * /sbin/shutdown -h +0 >> /var/log/shutdown.log 2>&1 - 验证是否生效:
sudo crontab -l查看内容,sudo grep CRON /var/log/syslog看执行记录
用 at 安排未来某天单次关机(如明天 10:15)
当你要在「明天上午 10:15」关机,又不想让它变成每天重复的任务,at 比 cron 更精准、更轻量。
- 先确认服务运行:
sudo systemctl is-active atd,若为inactive,需sudo systemctl enable --now atd - 提交任务:
echo "/sbin/shutdown -h now" | at 10:15 tomorrow—— 注意不是at tomorrow 10:15,顺序敏感 atq查看任务编号,atrm 3删除编号为 3 的任务- ⚠️ 关键限制:所有
at任务在系统重启后自动清空,不持久化 - 避免模糊语法:
at now + 30 minutes在某些发行版(如较老的 CentOS)不支持,优先用明确时间点
systemd timer 不是必要选择,除非你已有定制化需求
对单纯定时关机来说,systemd timer 是过度设计。它适合需要状态追踪、依赖其他 unit、或集成 journal 日志审计的场景。
- 要启用得写两个文件:
.service(定义关机动作)+.timer(定义触发时间),维护成本明显高于一行 cron - 优势仅体现在:可
systemctl status my-shutdown.timer查状态、支持OnCalendar=Mon,Wed,Thu 02:00这类复杂周期、重启后仍有效 - 如果你只是想“每天 2 点关机”,硬上 systemd 就像用起重机搬书——能动,但没必要
很多人最容易忽视的,其实是权限和路径这两个细节:无论用哪种调度方式,最后真正被调用的都是 /sbin/shutdown;而这个二进制默认通常只在 root 的 PATH 里。普通用户就算把 cron 或 at 写好了,没有相应权限,结果还是一样,根本执行不起来。还有一个绕不过去的事实也得说清楚:shutdown 本身并不具备“自动”属性,它更像一个执行器。所谓自动化,始终来自调度层,比如 cron、at、systemd,而不是这个命令天生就会自动运行。