如果你想在 Ubuntu 中实现每天 23:00 自动关机,需要通过 sudo crontab -e 编辑 root 用户的 crontab,并添加 0 23 * * * /sbin/shutdown -h now。这里必须使用命令的完整路径,同时要以 root 权限执行;如果使用普通用户的 crontab,通常会因为权限不足而静默失败,导致定时关机不生效。

定时关机要用 cron,而不是靠 shutdown -c 取消的那种预约
如果只是临时执行 shutdown +10 或 shutdown 23:00 来安排一次关机,处理起来比较简单,直接运行 shutdown -c 就能取消。但如果你把自动关机任务写进 cron,机制就完全不同了。因为这并不是系统中保留了一个“待执行的关机计划”,而是由 cron 在指定时间触发一次 /sbin/shutdown -h now,命令执行完即结束,整个流程并不存在可被撤销的“预约状态”。
所以关键结论很明确:如果你想让 Ubuntu 每天 23:00 定时关机,必须使用 sudo crontab -e 编辑 root 的 crontab,并写入:
0 23 * * * /sbin/shutdown -h now
- 必须写成
/sbin/shutdown的完整路径,因为cron默认不会读取用户的$PATH环境变量 - 不能使用普通用户 crontab(
crontab -e),否则由于权限不足,定时关机会失败,而且通常没有明显报错 - 如果要修改执行时间或停用任务,只能再次进入
sudo crontab -e,删除或注释这一行配置
rtcwake 才是真正能实现“定时唤醒”的命令
Linux 内核支持通过 RTC(实时时钟)进行唤醒,但这个能力通常只适用于休眠状态(suspend),并不支持系统彻底关机(poweroff)之后再自动唤醒。换句话说,你不能指望电脑在完全断电后自己开机,但可以让它先进入休眠,再在设定时间自动恢复运行。
比较典型的用法,是先让系统休眠,再设置唤醒时间:
sudo rtcwake -m mem -s 300
-m mem表示进入内存休眠(S3),唤醒速度快、功耗较低;-m disk表示休眠到硬盘(hibernate),更省电,但恢复速度更慢-s 300表示 300 秒后,也就是 5 分钟后自动唤醒;如果需要指定具体时间,也可以使用-t $(date +%s -d "tomorrow 06:00")- 唤醒之后系统会继续之前的运行状态,这不是重新开机,因此原有服务和进程都会保留
- 部分较老的 BIOS/UEFI 或某些笔记本电脑可能不支持 RTC 自动唤醒,需要在 BIOS 中启用 “RTC Alarm” 或 “Power On by RTC” 之类的选项
定时关机和定时唤醒需要配合使用,不能只依赖 cron
仅使用 cron 可以实现定时关机,但无法完成自动唤醒;而单独使用 rtcwake 则只能实现定时唤醒或休眠,不能替代关机调度。因此,Ubuntu 想实现接近“定时关机 + 定时开机”的效果,必须把两者结合起来使用,而且执行顺序不能搞错。
一种常见且稳定的做法是:在目标时间前几分钟通过 cron 执行 rtcwake,提前设置第二天的唤醒时间,然后立刻让系统进入休眠:
55 23 * * * /usr/bin/sudo /usr/sbin/rtcwake -m mem -t $(date -d "tomorrow 06:00" +%s) -s 0
- 这条命令的含义是:每天 23:55 自动执行,设置第二天 06:00 唤醒,并立即进入休眠状态(
-s 0) - 需要注意的是,这个命令本身并不是关机,而是休眠;如果你希望“23:00 关机,06:00 自动开机”,大多数 Ubuntu 设备并没有通用软件方案,通常需要硬件支持,例如带 WoL(网络唤醒)的主板和网络环境
- 如果目标是“定时关机后自动开机”,是否可行主要取决于主板固件功能,而不是 Ubuntu 本身的软件设置
- 在写入 cron 之前,务必先手动测试一次
rtcwake命令,确认机器能够正常休眠并按时唤醒,再加入定时任务
图形界面设置看起来方便,其实限制反而最多
Ubuntu 图形界面中的“电源 > 自动关机”相关选项,本质上依赖的是 systemd-logind 的 idle timeout 机制,并不是真正意义上的定时关机,而是“系统空闲 X 分钟后执行关机”。它无法按照具体时刻运行,也不能设置自动唤醒时间。
- 它只对当前登录的会话有效,切换用户或无人登录时可能不会生效
- 它无法与
rtcwake配合使用,也不能替代cron实现精确的时间调度 - 更适合临时需求,比如设定 30 分钟无操作后自动关机,而不适合每天固定时间执行的策略
- 如果你看到“已启用自动关机”却没有实际动作,通常是因为系统检测到仍有活跃会话,或者后台服务正在占用资源,因此不会强制关机
想要在 Ubuntu 中稳定实现定时关机与定时唤醒,核心其实只有两步:用 sudo crontab 控制关机或休眠的触发时机,用 rtcwake 设置自动唤醒的具体时间。这个过程中没有隐藏机制,每一个环节都需要手动验证是否生效,尤其是 BIOS 设置以及 Linux 内核是否正确识别 RTC 设备,这两处往往才是最容易出问题的关键点。
