一、先记住一句话(核心原理)
手动执行 = 完整环境变量 + 正常终端 + 完整PATH + 当前目录正确
crontab 执行 = 极简环境 + 空PATH + 工作目录是 / + 无终端 + 无交互
99% 的问题都出在:环境、路径、权限、目录、输出重定向。
二、终极排查步骤(从上到下,按顺序查)
1. 第一步:必须加日志!(最关键)
crontab 默认不输出任何信息,错了也不告诉你。
必须先给定时任务加全量日志,才能看到报错!
# 错误写法(无日志)
0 * * * * /root/test.sh
# 正确写法(标准排查模板)
0 * * * * /root/test.sh >> /root/cron.log 2>&1
然后执行:
tail -f /root/cron.log
所有错误一目了然:找不到命令、权限不足、路径错、语法错…
2. 第二步:检查 PATH 环境变量(80% 问题在这)
手动执行有完整 PATH
crontab 只有极简 PATH:/usr/bin:/bin
你脚本里的命令:
javapython3nodenpmkafka-topics.shmysqlffmpeg
在 crontab 里全部找不到!
排查方法
# 看你手动的 PATH
echo $PATH
解决方案(二选一)
- 脚本开头直接写完整 PATH(最稳)
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
- 命令全部使用绝对路径
# 错误
java -jar test.jar
# 正确
/usr/bin/java -jar test.jar
3. 第三步:检查脚本里的相对路径**(15% 问题)**
crontab 执行时,**当前工作目录是 /**不是 /root,不是 /home,是 /!
你脚本里写:
echo "test" > log.txt
实际生成路径是:
/log.txt
不是你以为的 /root/log.txt!
解决方案
所有文件路径必须写绝对路径
/root/app.log
/opt/data/run.pid
4. 第四步:检查是否缺少 #!/bin/bash
很多人脚本第一行忘写,手动能跑,crontab 不执行!
# 必须第一行
#!/bin/bash
5. 第五步:检查脚本权限 + 可执行
chmod +x /root/test.sh
6. 第六步:检查是否需要交互/终端
有些命令需要终端:
susudossh(未做免密)read- 某些需要交互的命令
crontab 无终端,会直接卡住/失败。
7. 第七步:检查 crontab 服务是否运行
systemctl status crond
systemctl restart crond
8. 第八步:查看系统 cron 日志(最终杀招)
tail -f /var/log/cron
能看到:
- 任务是否执行
- 执行时间
- 执行用户
- 是否报错
这是系统级铁证。
三、最常见 5 种错误模板(直接对照)
1. 找不到命令
command not found: java
→ PATH 问题
2. 没有那个文件或目录
no such file or directory
→ 相对路径问题
3. 权限不够
permission denied
→ chmod +x,或目录权限
4. 脚本执行了,但没效果
→ 输出没重定向,你以为没执行→ 加 >> /root/log 2>&1
5. 手动正常,crontab 完全没反应
→ 99% 是环境变量 + 相对路径
四、万能正确模板(以后直接复制)
1. 脚本模板 test.sh
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
cd /root
echo "执行成功" >> /root/result.log
2. crontab 模板
* * * * * /root/test.sh >> /root/cron.log 2>&1
五、面试标准答案(可直接存入知识库)
tags: #Linux #crontab #定时任务 #面试 #排查
题型:实操排查
难度:中级
题目:root定时脚本手动正常,crontab执行无结果,排查思路?
精简答案:
1. 加输出重定向,捕获错误日志;
2. 检查PATH环境变量,crontab环境极简,命令需绝对路径;
3. 检查相对路径,crontab工作目录是/,必须用绝对路径;
4. 检查脚本头#!/bin/bash、执行权限;
5. 查看/var/log/cron系统日志确认任务是否调度;
6. 检查是否需要交互终端,crontab无终端。
核心原因:
手动执行环境完整,crontab环境极简,导致路径、环境、目录不匹配。
你要我继续讲:
- Linux 定时任务高级用法
- crontab 秒级执行方案
- flock 防止重复执行
- systemd timer 替代 crontab
直接说数字就行!
关联文档
- ../../programming/shell/Shell 基础 — Shell 脚本
- ../system/Linux 基础 — 定时任务