结论:用 cron 配置周期性定时关机最稳,因为 shutdown -h 是一次性指令,需调度器驱动;cron 以 root 权限、绝对路径、日志记录保障可靠性和持久性,重启后仍生效。

直接说结论:用 cron 配置周期性定时关机最稳,shutdown -h 本身不“自动”,它只是一次性指令,必须靠调度器驱动。
为什么不能只跑 shutdown -h +30 就算完事
这条命令只是发起一个 30 分钟后关机的请求,不是“设置定时任务”。它有三个致命短板:
- 终端关闭或 SSH 断连后,后台运行的
shutdown进程可能被SIGHUP终止(即使加了&) - 机器重启后,该计划彻底丢失,不会恢复
- 没有错误反馈机制——如果磁盘满、权限不足或路径不对,它静默失败,你根本不知道
所以,单次临时用可以,但凡要“自动”“可靠”“可维护”,就必须交给调度器。
cron 设置每天固定时间关机(推荐首选)
这是生产环境最常用、最易排查的方式,但必须注意权限和路径细节:
- 必须编辑
root的 crontab:sudo crontab -e,普通用户 crontab 无法调用/sbin/shutdown - 命令必须用绝对路径:
/sbin/shutdown -h +0,不能写成shutdown -h now—— cron 环境下PATH极窄,找不到shutdown - 时间格式别写错:比如凌晨 1:15 关机,应写
15 1 * * *,不是01:15 - 加日志重定向,方便排障:
15 1 * * * /sbin/shutdown -h +0 >> /var/log/shutdown.log 2>&1
示例:每周一到周五 23:30 关机:30 23 * * 1-5 /sbin/shutdown -h +0
at 安排单次未来关机(适合临时维护)
当你只需要明天上午 10:20 关一次机,又不想污染 cron 规则,at 更干净,但依赖服务存活:
- 先确认
atd在运行:sudo systemctl is-active atd,若为inactive,执行sudo systemctl start atd && sudo systemctl enable atd - 提交任务时,
echo "/sbin/shutdown -h now" | at 10:20 tomorrow,注意是tomorrow,不是+1 day(后者在部分发行版不支持) -
at任务不持久:机器重启后,所有未执行的at任务全部消失,这点和 cron 不同 - 查任务用
atq,删任务用atrm,不能用kill或shutdown -c干预
容易被忽略的权限与路径陷阱
几乎所有失败都卡在这几个点上:
-
/sbin/shutdown在多数发行版中不在普通用户PATH里,cron 和 at 都不继承你的 shell 环境变量 - 没加
sudo是因为你在编辑 root 的 crontab;但如果误用普通用户 crontab,再怎么写绝对路径也失败 - 某些精简系统(如 Alpine)默认不装
at或cronie,得先apk add at cronie或对应包管理命令 -
shutdown -h now在 cron 中可能因信号竞争失败,统一用+0更稳妥
真正可靠的定时关机,不是选哪个命令炫技,而是让调度器能稳定找到关机程序、有日志可查、重启后依然生效——cron 满足全部,其它方案都在妥协。











