一个cron的环境问题

2024-09-07 18:15:03 浏览数 (2)

背景

在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,见补充。

0 人点赞