每天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,命令跑完就结束,整个过程根本不存在可以被取消的“预约状态”。
所以关键点是:想每天 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表示 5 分钟后唤醒;也可以用-t $(date +%s -d "tomorrow 06:00")精确到某时刻- 唤醒后系统继续运行,不是“开机”,所以所有服务、进程都保持原样
- 部分老旧 BIOS/UEFI 或笔记本可能不支持 RTC 唤醒,需在 BIOS 中开启 “RTC Alarm” 或 “Power On by RTC”
定时关机 + 定时唤醒要组合使用,不能只靠 cron
单纯靠 cron 只能关机,无法唤醒;单纯靠 rtcwake 只能唤醒,不能关机。二者必须配合,且顺序不能错。
常见可靠流程是:用 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) - 注意:该命令本身不关机,只是休眠;如需彻底关机后再唤醒,硬件不支持,得换带 WoL(网络唤醒)的主板+路由器
- 如果希望“23:00 关机 → 06:00 自动开机”,目前 Ubuntu 无通用软件方案,依赖主板固件能力
- 测试时务必先手动跑一遍
rtcwake命令,确认能正常唤醒,再塞进 cron
图形界面设置看似简单,实际限制最多
Ubuntu 设置里的“电源 > 自动关机”选项,底层调用的是 systemd-logind 的 idle timeout 机制,不是真正定时,而是“空闲 X 分钟后关机”。它不响应具体钟表时间,也无法设定唤醒。
- 它只对当前登录会话生效,切换用户或无人登录时无效
- 无法和
rtcwake协同,也不能替代cron的精确调度 - 适合临时场景(比如开会时设 30 分钟无操作关机),不适合固定时间策略
- 如果你看到“已启用自动关机”但没反应,大概率是因为系统判定“有活跃会话”或“有后台服务占用”,它不会强行关机
真正可靠的定时关机+唤醒组合,核心就两点:用 sudo crontab 控制关机/休眠时机,用 rtcwake 控制唤醒时刻。中间没有魔法层,所有环节都要亲手验证是否生效——尤其是 BIOS 设置和内核是否识别 RTC 设备,这两处最容易卡住。