Linux crontab 不执行原因总结

2次阅读

linux crontab不执行主因是环境、权限或路径问题:需用绝对路径或设path;确认用户权限与执行上下文一致;脚本用绝对路径并重定向日志;特殊字符如%须转义,避免中文标点。

Linux crontab 不执行原因总结

Linux crontab 不执行,多数不是“写错了”,而是环境、权限或路径细节没对上。下面列几个最常见、最容易忽略的原因和对应检查方法。

环境变量不同导致命令找不到

cron 默认只加载极简环境(PATH 通常只有 /usr/bin:/bin),你在 shell 里能直接运行的命令(比如 python3nodemysqldump),cron 可能根本找不到。

  • 用绝对路径写命令,例如 /usr/bin/python3 /home/user/script.py,而不是 python3 /home/user/script.py
  • 在 crontab 开头显式设置 PATH,例如:
    PATH=/usr/local/bin:/usr/bin:/bin
  • 临时加一行测试:在 crontab 中写 * * * * * env > /tmp/cron_env.txt,然后查看该文件确认实际环境

用户权限与执行上下文不一致

你用 crontab -e 编辑的是当前用户的定时任务,但脚本本身可能依赖其他用户权限(如读取某目录、访问数据库)、或需要 root 权限才能运行。

  • 确认你是用哪个用户添加的任务:普通用户?root?执行 ps aux | grep CRON 查看 cron 进程所属用户
  • 如果脚本要操作系统级资源(如重启服务、写 /var/log),必须用 sudo crontab -e 或直接编辑 /etc/crontab 并指定用户字段(如 root)
  • 注意:普通用户 crontab 不支持 user 字段,而系统级 /etc/crontab 格式是:分 时 日 月 周 用户 命令

脚本路径、工作目录、输出未处理

cron 执行时的当前工作目录是用户 home 目录(如 /home/user),不是脚本所在目录;且默认不捕获 stdout/stderr,出错也看不到提示。

  • 脚本中所有相对路径(如 ./data/file.txt../config.ini)都可能失效 —— 改用绝对路径,或开头加 cd /path/to/script
  • 务必重定向输出排查问题,例如:
    0 2 * * * /usr/bin/python3 /opt/myjob.py >> /var/log/myjob.log 2>&1
  • 日志里常出现 “No such file or Directory” 或 “Permission denied”,基本就是路径或权限问题

特殊字符未转义或语法格式错误

crontab 对 %、*、$、& 等字符敏感,未转义会导致解析失败或命令截断;同时格式必须严格(5个时间字段 + 命令)。

  • 命令中含 %(如 git commit -m “done%”)必须写成 %,否则 % 之后内容会被当成标准输入
  • 避免在 crontab 行末尾加注释符号 # 后直接跟文字 —— cron 会把整行当注释(除非前面有空格隔开)
  • 检查是否误用了中文标点、不可见字符(尤其从网页复制过来时),建议用 vi
    发表于:运维
    近一天内
text=ZqhQzanResources