crontab里直接写reboot不执行,因cron环境path不含/sbin、无root权限且不支持sudo密码交互;须用sudo crontab -e编辑root任务,写绝对路径命令如/sbin/shutdown -r now。

crontab 里直接写 reboot 或 shutdown -r now 大概率没反应——不是语法错,是环境缺失、权限错位、路径不对这三类问题卡死了。
为什么 crontab 里的 reboot 命令不执行
现象很典型:加了 * * * * * reboot,等半天没重启,查 /var/log/syslog 或 journalctl -u cron 会看到 Command not found 或 Operation not permitted。
根本原因有两个:
• cron 启动的 shell 是极简非交互式环境,PATH 通常只有 /usr/bin:/bin,而 reboot 在 /sbin/reboot,不在搜索路径里
• 普通用户 crontab 即使配了 sudo reboot,也过不了密码验证关——cron 不读取终端输入,sudo 直接失败
必须用 sudo crontab -e 编辑 root 的定时任务
别碰普通用户的 crontab -e,那里面加再多 sudo 都白搭。
正确做法只有一条路:
• 运行 sudo crontab -e(注意不是 crontab -e)
• 在打开的编辑器里写入带绝对路径的命令,例如:15 3 * * * /sbin/shutdown -r now
• 保存退出后,cron 会立即加载新规则
关键点:
• /sbin/shutdown -r now 比 /sbin/reboot 更稳妥:它会同步磁盘、通知服务、走完整关机流程,避免文件系统损坏
• 如果系统用 systemd,也可用 /usr/bin/systemctl reboot --no-wall,--no-wall 能屏蔽广播消息,防止干扰在线用户
写脚本调用重启时,PATH 和位置陷阱比想象中多
脚本不是不能用,但默认写法几乎必挂。
常见翻车点:
• 脚本里只写 reboot 或 shutdown -r now → cron 执行时报 command not found
• 脚本放在 /home/xxx/ 下 → 如果 /home 是独立加密分区,cron 根本读不到文件
• 脚本开头没声明 PATH → 找不到 shutdown
安全写法示例:
#!/bin/bash<br>PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin<br>/sbin/shutdown -r now
然后:
• 存成
/root/restart.sh(别放 /home)• 运行
chmod +x /root/restart.sh• 在 root crontab 中调用:
15 3 * * * /root/restart.sh别忘了确认 crond 服务本身在运行
所有配置都对,但机器就是不重启?先看最底层:
• 运行 systemctl status crond(CentOS/RHEL)或 systemctl status cron(Ubuntu/Debian)
• 如果显示 inactive (dead),执行 systemctl start crond 并 systemctl enable crond
另一个隐形坑:
• cron 解析时间字段全按服务器本地时区来,跨时区部署时,3 * * * * 可能不是你理解的“凌晨三点”——务必用 timedatectl 核对当前系统时区和时间











