crontab里写reboot没反应,因默认PATH不含/sbin且非交互式环境无法sudo认证;应改用绝对路径的/sbin/shutdown -r now或/usr/bin/systemctl reboot,并确保root权限与crond服务运行。

crontab里写reboot为什么没反应
直接在普通用户或root的crontab里写reboot,大概率静默失败。日志里常看到Command not found或Operation not permitted。根本原因有两个:crond启动时不加载/etc/environment或shell profile,PATH默认只有/usr/bin:/bin,而reboot在/sbin/reboot;即使路径对了,非交互式环境里sudo reboot也无法自动输密码,多数系统还默认禁止cron调用该命令。
必须用/sbin/shutdown -r now而非reboot
/sbin/shutdown -r now比/sbin/reboot更安全可靠,它会同步磁盘、通知服务、走完整关机流程,避免文件系统损坏。关键点:
- 必须用绝对路径:
/sbin/shutdown,不能只写shutdown - 别在普通用户
crontab里加sudo reboot——这根本不会执行 - 时间字段按服务器本地时区解析,跨时区部署务必核对
- 如果用systemd,可等价替换为
/usr/bin/systemctl reboot --no-wall(--no-wall屏蔽广播,避免干扰在线用户)
用脚本封装时PATH和位置陷阱
脚本不是不能用,但极易因环境缺失失败。比如脚本里只写reboot,cron执行时照样报错。正确写法:
- 脚本开头必须声明:第一行
#!/bin/bash,第二行显式设置PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin - 内容只需一行:
/sbin/shutdown -r now - 赋予执行权限:
chmod +x /root/restart.sh - 脚本不能放
/home下——若/home是独立加密分区,cron可能根本读不到 - 在root crontab中调用:
15 3 * * * /root/restart.sh
别忘了确认crond服务本身在运行
所有定时任务的前提是crond服务已启动。执行systemctl status crond检查状态,若未运行,先systemctl start crond。另外,生产环境强烈建议加一层保护逻辑,例如重启前检查是否有人登录:[ $(who | wc -l) -eq 0 ] && /sbin/shutdown -r now——否则误重启后果严重。


















