crontab 直接写 reboot 无反应,因默认 path 不含 /sbin,且需 root 权限;应使用绝对路径的 /sbin/shutdown -r now 或 /usr/bin/systemctl reboot 写入 root crontab。

crontab 里直接写 reboot 为什么没反应
因为 crontab 默认使用非交互式 shell,且多数系统对 reboot 命令做了权限限制——普通用户即使加了 sudo,也没法在 cron 环境下自动输入密码或读取环境变量。
- 现象:添加
* * * * * reboot后毫无反应,查/var/log/syslog或journalctl -u cron会看到类似Command not found或Operation not permitted - 根本原因:cron 不加载
/etc/environment或用户 profile,PATH 很短(通常只有/usr/bin:/bin),而reboot在/sbin/reboot,不在默认 PATH 里 - 解决方向:用绝对路径 + root 权限 + 显式环境声明
如何让 crontab 安全执行重启(推荐 root crontab)
不要在普通用户 crontab 里折腾 sudo,直接编辑 root 的定时任务最可靠。注意:必须用 sudo crontab -e,而不是 crontab -e(后者改的是当前用户,没权限)。
- 运行
sudo crontab -e,加入类似这行(每天凌晨 3:15 重启):15 3 * * * /sbin/shutdown -r now
-
/sbin/shutdown -r now比/sbin/reboot更稳妥:它会通知服务、同步磁盘、走标准关机流程,避免文件系统损坏 - 务必用绝对路径:
/sbin/shutdown,不能只写shutdown - 如果系统启用了 systemd,
shutdown实际是调用systemctl reboot,所以也可写:15 3 * * * /usr/bin/systemctl reboot --no-wall
(--no-wall避免广播消息干扰用户)
想用脚本控制重启?注意 PATH 和权限陷阱
写脚本不是不行,但容易因环境缺失失败。比如脚本里写 reboot,cron 执行时照样报错。
- 脚本开头必须声明 SHELL 和 PATH:
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin /sbin/shutdown -r now
- 脚本保存后,给执行权限:
chmod +x /root/restart.sh - 在 root crontab 中调用:
15 3 * * * /root/restart.sh
- 别把脚本放
/home下——如果 home 是独立分区且加密,cron 可能根本读不到 - 调试技巧:先手动运行
sudo -i -u root /root/restart.sh,模拟 cron 环境看是否报错
重启前加个确认或条件判断更稳妥
服务器误重启后果严重,尤其生产环境。硬编码定时重启不如加一层保护逻辑。
- 检查是否有用户登录:
15 3 * * * [ $(who | wc -l) -eq 0 ] && /sbin/shutdown -r now
(仅当无人登录时重启) - 检查负载是否低于阈值:
15 3 * * * [ $(uptime | awk -F'load average:' '{print $2}' | awk '{print $1*100}' | cut -d. -f1) -lt 50 ] && /sbin/shutdown -r now - 更推荐方式:用
shutdown -r +5提前 5 分钟通知,再配合shutdown -c可取消——适合需要人工干预的场景
真正麻烦的不是写那行 cron,而是没意识到 cron 的 PATH、用户上下文、systemd 依赖这些细节。一不留神,定时任务就静默失效,直到某天发现机器“忘了重启”——其实它从来就没跑成功过。











