应使用系统级cron(如/etc/cron.d/)配合绝对路径的/sbin/shutdown -r now实现定时重启,避免用户级crontab调用reboot导致权限失败;需确认命令路径、添加注释、规避selinux/systemd拦截,并优先选用shutdown以确保安全关机流程。

如何用 reboot 命令配合 crontab 实现定时重启
Linux 服务器定时重启不是“设个时间点就完事”,关键在于权限、执行环境和命令可靠性。reboot 是 root 权限命令,而普通用户 crontab 默认无权调用;且系统级 cron(如 /etc/crontab 或 /etc/cron.d/)才能安全触发重启操作。
实操建议:
- 不要在用户级
crontab -e中写reboot—— 即使加了sudo,也常因缺少 TTY 或密码交互失败 - 改用系统级 cron:编辑
/etc/cron.d/reboot-schedule(需 root),格式为分钟 小时 日 月 周 用户 命令 - 命令部分必须显式指定完整路径:
/sbin/reboot(不同发行版中reboot可能在/sbin或/usr/sbin,用which reboot确认) - 加注释说明用途,例如:
# Reboot every Sunday at 3:00 AM
示例(每周日凌晨 3 点重启):
0 3 * * 0 root /sbin/reboot
为什么 shutdown -r 比 reboot 更稳妥
shutdown -r 是带计划性、可取消、会通知已登录用户的正规重启方式;reboot 更接近强制硬重启,跳过正常关机流程,在某些虚拟化环境或使用 LVM/Btrfs 的系统上可能引发文件系统校验或挂载异常。
实操建议:
- 优先用
/sbin/shutdown -r,同样需绝对路径 - 可加延迟参数避免误触发,例如
shutdown -r +5 "System restart in 5 minutes",但 cron 中不建议用相对时间(+5),应使用绝对时间点 - 若需立即重启,用
shutdown -r now;注意now是关键字,不能加引号 - 确认
shutdown所在路径:which shutdown,常见为/sbin/shutdown
对应 cron 条目:
0 3 * * 0 root /sbin/shutdown -r now
crontab 定时重启的三个典型陷阱
看似一行配置就能搞定,实际线上踩坑多集中在环境、权限和路径上。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
常见错误现象:
- 日志里出现
CRON[1234]: (root) CMD (/sbin/reboot),但服务器没重启 —— 很可能是 SELinux 或 systemd 阻止了 cron 调用reboot(检查journalctl -u cron -n 50和ausearch -m avc -ts recent) - 重启后服务没起来,或磁盘显示只读 —— 因未走
shutdown流程,journal 或 fsck 未正确触发 - 定时任务在 DST 切换日失效(如夏令时开始/结束当天少/多执行一次)—— cron 使用系统本地时间,且不自动跳过/重复,需人工核对
规避建议:
- 所有 cron 脚本命令都用绝对路径,别依赖
$PATH(cron 的 PATH 通常极简) - 重启前加简单健康检查,例如:
/sbin/shutdown -r now && logger "Scheduled reboot triggered" - 首次部署后,用
run-parts --test /etc/cron.d检查语法,再手动运行命令验证权限
要不要写 shell 脚本封装重启逻辑
直接写 cron 行足够简单,但一旦需要判断条件(如仅当负载低于阈值、或仅在维护窗口)、记录日志、或兼容多环境(测试/生产),脚本就变得必要。
实操建议:
- 脚本开头务必加
#!/bin/bash,并用set -e确保出错即停 - 避免在脚本里用
sudo—— cron 以 root 运行时,直接调用/sbin/shutdown即可 - 日志重定向要明确:
/sbin/shutdown -r now >> /var/log/reboot-schedule.log 2>&1 - 脚本保存到
/usr/local/bin/reboot-if-safe.sh,chmod +x,并在 cron 中调用它
最小可用脚本示例:
#!/bin/bash set -e logger "Starting scheduled reboot check" /sbin/shutdown -r now logger "Reboot command issued"
真正麻烦的从来不是“怎么写那行 cron”,而是重启那一刻有没有人在看控制台、有没有数据库正在写盘、以及那个被忽略的 /sbin 路径是否真的存在。










