Crontab 脚本执行无结果排查
1. 看你手动的 PATH
echo $PATH
### 解决方案(二选一)
1. **脚本开头直接写完整 PATH**(最稳)
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
2. **命令全部使用绝对路径**
2. 错误
java -jar test.jar
3. 正确
/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 不执行!
4. 必须第一行
#!/bin/bash
---
## 5. **第五步:检查脚本权限 + 可执行**
chmod +x /root/test.sh
---
## 6. **第六步:检查是否需要交互/终端**
有些命令需要终端:
- `su`
- `sudo`
- `ssh`(未做免密)
- `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执行无结果,排查思路?
精简答案:
- 加输出重定向,捕获错误日志;
- 检查PATH环境变量,crontab环境极简,命令需绝对路径;
- 检查相对路径,crontab工作目录是/,必须用绝对路径;
- 检查脚本头#!/bin/bash、执行权限;
- 查看/var/log/cron系统日志确认任务是否调度;
- 检查是否需要交互终端,crontab无终端。 核心原因: 手动执行环境完整,crontab环境极简,导致路径、环境、目录不匹配。
---
## 你要我继续讲:
1. **Linux 定时任务高级用法**
2. **crontab 秒级执行方案**
3. **flock 防止重复执行**
4. **systemd timer 替代 crontab**
直接说数字就行!
---
> [!info] 关联文档
> - [[Shell 基础]]:Shell 脚本
> - [[Linux 基础]]:定时任务
