crontab里直接写reboot无反应,因cron默认PATH不含/sbin、不加载用户环境且需root权限;应使用绝对路径命令(如/sbin/shutdown -r now)写入root crontab,并显式声明PATH和SHELL以确保执行。

crontab 里直接写 reboot 没反应,不是你配置错了,而是根本没权限、没路径、没环境——别硬试,按下面几步走准没错。
为什么 reboot 在 crontab 里不生效
现象:加了 * * * * * reboot,日志里只看到 CRON[1234]: (root) CMD (reboot),但机器纹丝不动。
根本原因有三个:
• reboot 命令在 /sbin/reboot,而 cron 默认 PATH 通常只有 /usr/bin:/bin,找不到该命令
• cron 运行在非交互式 shell,不加载 /etc/environment 或用户 profile,sudo 也无法自动输密码
• 即使你用普通用户加 sudo reboot,cron 环境下 sudo 会因缺少 TTY 或策略限制直接拒绝
必须用 root crontab + 绝对路径命令
不要在普通用户 crontab 里折腾 sudo,直接编辑 root 的任务最干净可靠:
• 运行 sudo crontab -e(不是 crontab -e,后者改的是当前用户)
• 写入带绝对路径的关机命令,例如每天凌晨 3:15 重启:15 3 * * * /sbin/shutdown -r now
• 更推荐用 /usr/bin/systemctl reboot --no-wall(systemd 系统),避免广播消息干扰在线用户
• 切忌只写 shutdown 或 reboot——必须是完整路径,否则 cron 找不到
加登录检查防误重启
生产环境最怕半夜自动重启时还有人连着 SSH。加个简单判断就能规避:
• 把命令改成:15 3 * * * [ $(who | wc -l) -eq 0 ] && /sbin/shutdown -r now
• 这行意思是“没人登录才执行重启”,who 输出为空时返回 0 行
• 注意:如果用了 systemd-logind 或容器环境,who 可能漏判;更严谨可查 loginctl list-sessions --no-legend | wc -l
• 不建议用 pgrep -f sshd | wc -l,它会把监听进程也算进去,误判率高
脚本方式要显式声明 PATH 和 SHELL
写脚本不是不行,但默认环境缺失是高频失败点:
• 脚本开头必须包含:#!/bin/bashPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
• 命令仍要用绝对路径,比如 /sbin/shutdown -r now
• 脚本存放在 /root/ 或 /usr/local/bin/,别放 /home 下——若 home 是独立加密分区,cron 根本读不到
• 权限设为 chmod +x /root/restart.sh,并在 root crontab 中调用:15 3 * * * /root/restart.sh
• 调试时先手动模拟 cron 环境:sudo -i -u root /root/restart.sh,看是否报错
真正容易被忽略的不是语法,而是 cron 的环境隔离性——它不继承你的 shell 配置,也不管你终端里 which reboot 能不能找到。每次写完记得查 journalctl -u cron -n 20,看有没有 Command not found 或 Operation not permitted。


















