Cron作业无法找到ADB二进制文件的问题排查求助
解决Cron执行Python脚本时找不到ADB的问题
核心原因
Cron的运行环境和用户登录shell的环境变量差异极大,默认PATH范围非常有限,且默认使用/bin/sh而非bash,导致你之前的环境变量配置无法正确生效。此外你之前的部分Cron命令写法存在逻辑错误,比如把ADB路径当成Python脚本的执行器,完全不符合语法要求。
有效解决方案
1. 直接在Python脚本中指定ADB绝对路径
这是最可靠的方案,彻底绕开Cron的环境变量问题:
打开inventory_driver.py,找到所有调用ADB的代码(比如subprocess调用的部分),把adb替换为完整的绝对路径:
# 原代码示例 import subprocess subprocess.run(["adb", "devices"]) # 修改后 adb_full_path = "/home/<>/resources/AndroidTools/android-sdk-linux/platform-tools/adb" subprocess.run([adb_full_path, "devices"])
这样不管Cron的PATH是什么,脚本都能直接定位到ADB二进制文件。
2. 正确在Cron中配置PATH并使用绝对路径调用脚本
Cron中设置PATH要放在任务的上方,同时脚本路径必须用绝对路径(避免~解析异常):
编辑你的crontab(执行crontab -e),写入:
# 配置包含ADB的PATH,同时保留系统默认PATH避免其他命令找不到 PATH=/usr/bin:/bin:/home/<>/resources/AndroidTools/android-sdk-linux/platform-tools # 每日清晨6点执行,输出日志到文件方便排查问题 0 6 * * * python3 /home/你的用户名/.lab_inventory/inventory_driver.py > /var/log/inventory_script.log 2>&1
注意:替换
你的用户名为实际用户名,日志路径要确保当前用户有写入权限。
3. 用bash明确加载用户环境执行脚本
如果你的.bashrc里已经正确配置了ADB的PATH,可以让Cron调用bash并加载用户环境:
0 6 * * * bash -c "source /home/你的用户名/.bashrc && python3 /home/你的用户名/.lab_inventory/inventory_driver.py" > /var/log/inventory_script.log 2>&1
这种方式会让bash加载你的用户环境变量,确保ADB的PATH被正确识别。
4. 修复错误的Cron命令写法
你之前写的/home/<>/.../adb python3 ...是完全错误的,这是试图用ADB二进制文件去执行Python脚本,逻辑上不成立,必须删除ADB路径部分,只保留Python脚本的调用命令。
内容的提问来源于stack exchange,提问作者Noctrim
相关产品推荐
相关产品推荐

