在linux机器上,有配置cron定时任务,作用是在一个django的服务中执行脚本,进行一些数据统计。
10 2 * * * /data/be/server/ber/venv/bin/python3 /data/be/server/ber/apps/measure/measure_data.py b_week > /dev/null 2>&1
这个be服务是个老python服务,已经重构完成了,最近又大改了发布方式。老服务里面很多潜在的逻辑,甚至有的文件在服务器上有,而没提交到代码中。我本人是十分反对这么做的。
当时发布完成后,定时任务不起作用。
直接执行/data/be/server/ber/venv/bin/python3 /data/be/server/ber/apps/measure/measure_data.py b_week > /dev/null 2>&1提示配置找不到:
ModuleNotFoundError: No module named 'util'
这种一般是没有用到服务的ven环境,所以在执行命令前先增加一个环境的配置: export PYTHONPATH=$PYTHONPATH:/data/be/server/ber &&
接着又提示:
django.core.exceptions.ImproperlyConfigured: Requested setting PROJECT_PATH, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
于是再增加一个配置:
export DJANGO_SETTINGS_MODULE=ber.settings
手动在命令行中执行,成功。
于是配置到cron中,结束
10 2 * * * export PYTHONPATH=$PYTHONPATH:/data/be/server/ber && export DJANGO_SETTINGS_MODULE=ber.settings && /data/be/server/ber/venv/bin/python3 /data/be/server/ber/apps/measure/measure_data.py b_week > /dev/null 2>&1
结果到了第二天,任务并没有正确执行,也没有任何信息。
增加输出日志:
10 2 * * * export PYTHONPATH=$PYTHONPATH:/data/be/server/ber && export DJANGO_SETTINGS_MODULE=ber.settings && /data/be/server/ber/venv/bin/python3 /data/be/server/ber/apps/measure/measure_data.py b_week > /data/cc.log 2>&1
修改触发时间,从cc.log中查看到,里面的逻辑居然调用了测试环境的接口。而看配置,应该要调用abc.com,
是否是nds解析到了测试环境?
执行
nslookup abc.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: example.com
Address: 93.184.216.34
得到的数据就是线上环境的地址。
代码中全局查找测试环境地址,发现只有在获取环境变量d的时候,会判断是走测试环境还是线上环境。
于是再增加这个环境变量
10 2 * * * export d=online && export PYTHONPATH=$PYTHONPATH:/data/be/server/ber && export DJANGO_SETTINGS_MODULE=ber.settings && /data/be/server/ber/venv/bin/python3 /data/be/server/ber/apps/measure/measure_data.py b_week > /data/cc.log 2>&1
执行成功。
将export环境变量提取到一个sh脚本中,因为有很多cron都要用。
还可以输入其他日志
#!/bin/bash
export d=online
export PYTHONPATH=$PYTHONPATH:/data/be/server/ber
export DJANGO_SETTINGS_MODULE=ber.settings
echo "Current PATH: $PATH" >> /data/cc.log
echo "Current working directory: $(pwd)" >> /data/cc.log
cron简化为
10 2 * * * zz.sh && /data/be/server/ber/venv/bin/python3 /data/be/server/ber/apps/measure/measure_data.py b_week > /data/cc.log 2>&1
在系统发布的时候,已经将d环境变量设置到~./.bashrc中了,而cron启动的进程中就获取不到呢,不应该是全局的吗?!那这么多环境变量,难道都要在zz.sh中设置一遍否?
ORZ,见补充。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。