前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个cron的环境问题

一个cron的环境问题

原创
作者头像
二锅头一桶天下
修改2024-09-07 18:15:03
1170
修改2024-09-07 18:15:03

背景

在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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 发布之后出问题
  • 再次出问题
  • 精简
  • 问题
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档