Ubuntu服务器Cron执行Python脚本时触发ODBC数据源未找到错误
问题重现
手动运行调用NetSuite ODBC驱动的Python脚本及对应bash脚本正常,但通过Ubuntu的crontab执行时抛出错误:
pyodbc.InterfaceError: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)')
执行的bash脚本:
#!/bin/bash source /home/username/Documents/code/.venv/bin/activate /home/username/Documents/code/.venv/bin/python3 /home/username/Documents/code/odbc.py
手动执行时处于/home/username目录,且已确认odbcinst.ini中存在对应驱动。
核心原因
Cron的运行环境不会自动加载用户登录shell的配置文件(如.bashrc、.profile),导致ODBC驱动管理器无法定位odbcinst.ini的位置,或缺少必要的环境变量支撑驱动查找。
具体解决步骤
1. 在bash脚本中手动指定ODBC环境变量
在激活虚拟环境前,添加ODBC配置文件的路径声明,确保驱动管理器能找到配置:
#!/bin/bash # 手动设置ODBC配置文件路径(根据实际路径调整) export ODBCSYSINI=/etc export ODBCINI=/etc/odbcinst.ini # 激活虚拟环境并执行脚本 source /home/username/Documents/code/.venv/bin/activate /home/username/Documents/code/.venv/bin/python3 /home/username/Documents/code/odbc.py
注:若
odbcinst.ini位于用户目录(如~/.odbcinst.ini),则将ODBCINI设为/home/username/.odbcinst.ini。
2. 验证连接字符串的驱动名称正确性
检查config.connection_string中的驱动名称,必须和odbcinst.ini内的条目完全一致(大小写敏感)。例如odbcinst.ini中驱动配置为:
[NetSuite ODBC Driver] Driver=/path/to/netsuite/odbc/driver.so
则连接字符串的Driver部分必须写为{NetSuite ODBC Driver}。
3. 加载用户shell配置文件
若ODBC相关环境变量已在.bashrc或.profile中配置,可在bash脚本开头直接加载这些文件:
#!/bin/bash # 加载用户bash配置文件 source /home/username/.bashrc # 激活虚拟环境并执行脚本 source /home/username/Documents/code/.venv/bin/activate /home/username/Documents/code/.venv/bin/python3 /home/username/Documents/code/odbc.py
若使用
.profile,替换为source /home/username/.profile即可。
4. 对比Cron与手动运行的环境变量
编写测试脚本让Cron执行,打印其环境变量并与手动运行环境对比:
#!/bin/bash env > /home/username/cron_env.txt
添加到Cron执行后,查看cron_env.txt,并与手动执行env > manual_env.txt的结果对比,确认ODBC相关变量是否缺失。
验证方法
修改bash脚本后先手动执行确认正常,再更新Cron任务(可临时设置为1分钟后执行),通过日志或状态记录验证问题是否解决。
内容的提问来源于stack exchange,提问作者wd_saber

