Linux

Crontab 脚本执行无结果排查

·7 分钟阅读·2426 字
📋 目录

一、先记住一句话(核心原理)

手动执行 = 完整环境变量 + 正常终端 + 完整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

你脚本里的命令:

  • java
  • python3
  • node
  • npm
  • kafka-topics.sh
  • mysql
  • ffmpeg

在 crontab 里全部找不到!

排查方法

# 看你手动的 PATH
echo $PATH

解决方案(二选一)

  1. 脚本开头直接写完整 PATH(最稳)
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  1. 命令全部使用绝对路径
# 错误
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. 第六步:检查是否需要交互/终端

有些命令需要终端:

  • 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执行无结果,排查思路?

精简答案:
1. 加输出重定向,捕获错误日志;
2. 检查PATH环境变量,crontab环境极简,命令需绝对路径;
3. 检查相对路径,crontab工作目录是/,必须用绝对路径;
4. 检查脚本头#!/bin/bash、执行权限;
5. 查看/var/log/cron系统日志确认任务是否调度;
6. 检查是否需要交互终端,crontab无终端。

核心原因:
手动执行环境完整,crontab环境极简,导致路径、环境、目录不匹配。

你要我继续讲:

  1. Linux 定时任务高级用法
  2. crontab 秒级执行方案
  3. flock 防止重复执行
  4. systemd timer 替代 crontab

直接说数字就行!

关联文档

  • ../../programming/shell/Shell 基础 — Shell 脚本
  • ../system/Linux 基础 — 定时任务