Python脚本无法在cron中运行的排查求助
问题描述
目录结构
目标目录:path/to/test
执行tree命令输出:
. ├── Pipfile ├── test.py ├── test.sh └── test.txt
文件内容
test.py
#!/usr/bin/env python3 import datetime with open("/path/to/test/test.txt", "a") as f: f.write(f"{datetime.datetime.now()}\n")
test.sh
#!/bin/zsh pipenv run python /Users/ayubkeshtmand/Downloads/test/test.py
Cron配置(crontab -l输出)
SHELL=/bin/zsh PATH=/Library/Frameworks/Python.framework/Versions/3.10/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/bin/python3:/Library/Frameworks/Python.framework/Versions/3.10/bin:/opt/homebrew/bin:/opt/homebrew/sbin * * * * * env > /tmp/env.output # 可正常运行 * * * * * touch /path/to/anothertest.txt # 可正常运行 * * * * * python /path/to/test/test.py # 无法运行 * * * * * python3 /path/to/test/test.py # 无法运行 * * * * * pipenv run python /path/to/test/test.py # 无法运行 * * * * * zsh /path/to/test/test.sh # 无法运行 * * * * * /Library/Frameworks/Python.framework/Versions/3.10/bin/python3 /path/to/test/test.py # 无法运行 * * * * * bash -l -c "python /path/to/test.py" # 无法运行 * * * * * bash -l -c "pipenv run python /path/to/test.py" # 无法运行
环境变量对比
Cron环境(/tmp/env.output内容)
SHELL=/bin/zsh PATH=/Library/Frameworks/Python.framework/Versions/3.10/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/bin/python3:/Library/Frameworks/Python.framework/Versions/3.10/bin:/opt/homebrew/bin:/opt/homebrew/sbin LOGNAME=myusername USER=myusername HOME=/path/to SHLVL=0 PWD=/path/to OLDPWD=/path/to _=/usr/bin/env
常规终端环境(env输出)
USER=myusername MallocNanoZone=0 __CFBundleIdentifier=com.microsoft.VSCode COMMAND_MODE=unix2003 LOGNAME=myusername PATH=/Library/Frameworks/Python.framework/Versions/3.10/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/bin/python3:/Library/Frameworks/Python.framework/Versions/3.10/bin:/opt/homebrew/bin:/opt/homebrew/sbin SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.RyAiUT08FA/Listeners SHELL=/bin/zsh HOME=/path/to __CF_USER_TEXT_ENCODING=0x1F6:0:2 TMPDIR=/var/folders/64/wd951s6x3pz3ytpq1wjz5n180000gp/T/ XPC_SERVICE_NAME=0 XPC_FLAGS=0x0 ORIGINAL_XDG_CURRENT_DESKTOP=undefined SHLVL=1 PWD=/path/to OLDPWD=/path/to HOMEBREW_PREFIX=/opt/homebrew HOMEBREW_CELLAR=/opt/homebrew/Cellar HOMEBREW_REPOSITORY=/opt/homebrew MANPATH=/opt/homebrew/share/man:/usr/share/man:/usr/local/share/man:/opt/homebrew/share/man: INFOPATH=/opt/homebrew/share/info:/opt/homebrew/share/info: GITHUB_TOKEN=fwlkehjgowih4t089240btonglkwenkjbalfihoi283 TERM_PROGRAM=vscode TERM_PROGRAM_VERSION=1.74.1 LANG=en_GB.UTF-8 COLORTERM=truecolor GIT_ASKPASS=/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass.sh VSCODE_GIT_ASKPASS_NODE=/Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper.app/Contents/MacOS/Code Helper VSCODE_GIT_ASKPASS_EXTRA_ARGS=--ms-enable-electron-run-as-node VSCODE_GIT_ASKPASS_MAIN=/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass-main.js VSCODE_GIT_IPC_HANDLE=/var/folders/64/gowiehg92834hbgobwkgjegp/T/vscode-git-45fnwiuheg284.sock VSCODE_INJECTION=1 ZDOTDIR=/path/to USER_ZDOTDIR=/path/to TERM=xterm-256color PS1=%n@%m %1~ %# _=/usr/bin/env
补充说明
/var/logs无相关执行日志- 未收到系统
mail的错误提示 - 除
env和touch命令外,其余Python/Pipenv相关Cron任务均失败
解决方案
1. 修复脚本执行权限
给Python脚本和Shell脚本添加可执行权限:
chmod +x /path/to/test/test.py chmod +x /path/to/test/test.sh
2. 解决Pipenv虚拟环境识别问题
Pipenv依赖当前目录的Pipfile识别虚拟环境,Cron执行时需先切换到脚本目录,同时指定Pipenv的完整路径:
- 先在终端查询Pipenv的绝对路径:
which pipenv
- 修改Cron任务为:
* * * * * cd /path/to/test && /opt/homebrew/bin/pipenv run python test.py >> /tmp/cron_pipenv.log 2>&1
(将/opt/homebrew/bin/pipenv替换为你查询到的实际路径)
3. 直接指定Python解释器完整路径
如果不需要Pipenv,直接用系统Python执行,先在终端查Python3的绝对路径:
which python3
然后修改Cron任务:
* * * * * /Library/Frameworks/Python.framework/Versions/3.10/bin/python3 /path/to/test/test.py >> /tmp/cron_python.log 2>&1
4. 给Shell脚本补全环境变量
修改test.sh,添加缺失的环境变量并切换到脚本目录:
#!/bin/zsh # 补全Homebrew相关环境变量 export HOMEBREW_PREFIX=/opt/homebrew export PATH=$HOMEBREW_PREFIX/bin:$HOMEBREW_PREFIX/sbin:$PATH # 切换到脚本所在目录 cd /path/to/test pipenv run python test.py
然后修改Cron任务为:
* * * * * /path/to/test/test.sh >> /tmp/cron_sh.log 2>&1
5. 调试错误日志
所有Cron任务添加输出重定向,执行后查看日志文件,就能定位具体错误(比如找不到模块、路径错误、权限不足等):
# 格式示例 * * * * * [你的命令] >> /tmp/cron_debug.log 2>&1
内容的提问来源于stack exchange,提问作者AK91
相关产品推荐
相关产品推荐

