Python脚本调用TimesTen查询手动正常,crontab执行输出为空如何解决
问题原因
你遇到的问题和TimesTen本身是否支持cron环境无关,100%是cron执行环境和你手动执行的交互式shell环境不一致导致的,核心问题有两个:
- cron的默认
PATH环境变量仅包含/usr/bin、/bin等基础路径,你手动执行时PATH里配置了TimesTen的bin目录,所以能找到ttIsqlCS命令,cron执行时找不到该命令,静默执行失败所以输出文件为空 - 你脚本中使用的
file.txt、output.txt都是相对路径,cron执行任务的默认工作目录是执行用户的家目录,不是脚本所在的/export/home/user/script/bin/目录,会出现找不到输入文件、输出文件写入位置和预期不符的问题
修复步骤
你猜测的指定ttIsqlCS绝对路径是正确的方向,按以下顺序调整即可:
- 所有路径替换为绝对路径
首先确认ttIsqlCS的实际绝对路径(可手动执行which ttIsqlCS获取),同时将脚本中所有文件路径替换为绝对路径,建议同时把错误输出也重定向到输出文件方便后续排查,修改后代码示例:os.system('/your/actual/path/to/ttIsqlCS -f /export/home/user/script/bin/file.txt dsn=dsn > /export/home/user/script/bin/output.txt 2>&1') - 补充TimesTen依赖的环境变量
如果修改路径后仍有问题,需要确认你手动环境下的TIMESTEN_HOME、LD_LIBRARY_PATH、ODBCINI等变量配置,有两种方式同步到cron环境:- 方式1:在crontab命令中先加载用户配置文件再执行脚本,修改crontab配置如下(如果你用的是bash,对应修改为你的shell配置文件路径):
05 14 * * * source /export/home/user/.bash_profile && /usr/bin/python /export/home/user/script/bin/script.py - 方式2:直接在Python脚本开头设置需要的环境变量,示例:
import os os.environ['TIMESTEN_HOME'] = '/your/path/to/TimesTen' os.environ['LD_LIBRARY_PATH'] = f"{os.environ.get('LD_LIBRARY_PATH', '')}:/your/path/to/TimesTen/lib" os.environ['ODBCINI'] = '/your/path/to/odbc.ini'
- 方式1:在crontab命令中先加载用户配置文件再执行脚本,修改crontab配置如下(如果你用的是bash,对应修改为你的shell配置文件路径):
- 可选排查手段
如果还是有异常,可在脚本开头添加代码打印cron执行时的全量环境变量到日志文件,和你手动执行时的环境变量对比,快速定位缺失的配置项。
内容的提问来源于stack exchange,提问作者knight
相关产品推荐
相关产品推荐

