pyhton django web集群基于linux定时任务
基于django management/commands目录下的脚本
from django.core.management import BaseCommand
import logging
import uuid
from pia.utils.cache import reset_redis_expire
from pia.utils.reids_key import TASK_KEYlogging = logging.getLogger('task')"""
定时任务: 定时任务 看门狗续时
"""class Command(BaseCommand):def add_arguments(self, parser):parser.add_argument('trace_id', type=str)def handle(self, *args, **options):trace_id = options["trace_id"]if not trace_id:trace_id = str(uuid.uuid4())self.trace_id = trace_idself.writeLog('watchdog continuation start')reset_redis_expire(TASK_KEY + "privacy_detect", 80)reset_redis_expire(TASK_KEY + "privacy_analysis", 80)reset_redis_expire(TASK_KEY + "privacy_notify", 80)reset_redis_expire(TASK_KEY + "tx_organization", 80)reset_redis_expire(TASK_KEY + "send_message", 80)reset_redis_expire(TASK_KEY + "todo_notify", 80)reset_redis_expire(TASK_KEY + "thirdparty_ex_notify", 80)reset_redis_expire(TASK_KEY + "cookies_scan", 80)reset_redis_expire(TASK_KEY + "xuanwu_app_scan", 80)self.writeLog('watchdog continuation end')def writeLog(self, msg: str):logging.info(f'[{self.trace_id}] {msg}')
import sys
import os
from pathlib import Path
from tasks import CrontabTask# 添加 Django 项目的根目录到 Python 路径
django_project_path = Path(__file__).resolve().parent.parent.parent
sys.path.append(str(django_project_path))
# 设置 DJANGO_SETTINGS_MODULE 环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tencheck.settings')
if __name__ == '__main__':"""总入口 脚本启动信息"""# crontab任务 redis keyredis_key = sys.argv[1]# crontab任务名称task_name = sys.argv[2]# 环境yaml文件env = sys.argv[3]env_name = sys.argv[4]config_name = sys.argv[5]rainbow_key = sys.argv[6]os.environ.setdefault('ENV_NAME', env_name)os.environ.setdefault('CONFIG_NAME', config_name)os.environ.setdefault('RAINBOW_KEY', rainbow_key)task = CrontabTask(env=env, redis_key=redis_key, task_name=task_name)task.start()
from pathlib import Path
import os
import sys
import logging
import time
import traceback
import uuid
import yaml
from django.core.cache import cacheTASK_KEY = "pia:crontab:"class BaseTask:def __init__(self, *args, **kwargs):self.env = kwargs.get('env')self.task_name = kwargs.get('task_name')self.redis_key = kwargs.get('redis_key')self.workspace = Path(__file__).resolve().parent.parent.parentself.config = self.load_config()self.pid = os.getpid()self.trace_id = str(uuid.uuid4())def load_config(self):""" 读取配置文件 """config = {}with open(os.path.join(self.workspace, f"task/conf/config-{self.env}.yaml"), 'r') as f:config = yaml.safe_load(f)return configdef writelog(self, text: str) -> None:""" 记录日志 """log_path = self.config['log_path']formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")file_handler = logging.FileHandler(log_path + "/crontab_task.log") # 日志目录file_handler.setFormatter(formatter)logger = logging.getLogger()logger.addHandler(file_handler)logger.setLevel(logging.DEBUG)text = time.strftime(f'[PID:{self.pid}] ', time.localtime(time.time())) + textlogger.info(f'[{self.trace_id}] ' + text) # 写入日志logger.removeHandler(file_handler)file_handler.close()def script_err_report(push_user: list, info: str) -> None:""" 脚本告警信息 """# writelog(info)passdef start_crontab(self) -> int:"""redis控制脚本执行"""try:redis_key = self.redis_key"""保证原子性 True if lock acquired, False otherwise"""task_status = cache.add(TASK_KEY + redis_key, True, 80)if task_status:self.writelog(f"task set redis key {TASK_KEY + redis_key}")return 0else:self.writelog(f"task redis key {TASK_KEY + redis_key} exists")return 1except Exception:self.writelog(f"redis connect fail {traceback.format_exc()}")def end_crontab(self) -> None:""" 清除redis信息 """try:redis_key = self.redis_keycache.delete(TASK_KEY + redis_key)self.writelog(f"clean redis key {TASK_KEY + redis_key}")except Exception:self.writelog(f"redis connect fail {traceback.format_exc()}")def start(self):start_time = time.time()execute = Falsetry:self.writelog(f"task {self.task_name} start")if self.start_crontab() != 0:error_info = f"task {self.task_name} not finish!"self.writelog(error_info)sys.exit(0)execute = Trueself.do_work()except Exception as e:result_err_info = traceback.format_exc()self.writelog(f"{self.task_name} ERROR: {result_err_info}")# 告警# self.script_err_report(SCRIPT_ERR_REPORT_USER, result_err_info)finally:end_time = time.time()self.writelog(f"{self.task_name} cost time {end_time - start_time}")if execute:self.end_crontab()def do_work(self):""" 脚本核心功能主流程 """# self.writelog("privacy analysis task start")# cmds = [f'cd {WORKSPACE_DIR} && {self.config["privacy_detect"]["python_path"]} manage.py privacy_analysis {self.trace_id}']# retcode = subprocess.call(cmds, shell=True)# self.writelog(f"privacy analysis task end retcode:{retcode}")
import subprocess
from base_task import BaseTaskclass CrontabTask(BaseTask):def do_work(self):config = self.configtask_name = self.task_nameworkspace = self.workspaceself.writelog(f"{task_name} task start")cmds = [f'cd {workspace} && {config["python_path"]} manage.py {task_name} {self.trace_id}']retcode = subprocess.call(cmds, shell=True)self.writelog(f"{task_name} task end retcode:{retcode}")
将任务添加到Linux服务器的 crontab里面
# argv[1]------redis_key ; argv[2]------task_name即 commands目录下 crontab_前缀的文件 ; argv[3]------配置文件 ; argv[4]------环境变量 ; argv[5]------组 ; argv[6]------通道*/1 * * * * cd /usr/local/oit/tencheck && ../env/bin/python3.11 task/script/start_task.py watchdog crontab_watchdog tx xx xx xx >/dev/null 2>&1 &
相关文章:
pyhton django web集群基于linux定时任务
基于django management/commands目录下的脚本 from django.core.management import BaseCommand import logging import uuid from pia.utils.cache import reset_redis_expire from pia.utils.reids_key import TASK_KEYlogging logging.getLogger(task)""" …...
探索 Python 字典的奥秘:Future 对象为何能成为字典的键?
本质在于作为字典的key能不能执行hash(key) 问题 import concurrent.futuresdef task(n):return n * n# 创建一个线程池 with concurrent.futures.ThreadPoolExecutor() as executor:# 提交任务并获取 Future 对象future_to_num {executor.submit(task, i): i for i in rang…...
多品牌摄像机视频平台EasyCVR视频融合平台+应急布控球:打造城市安全监控新体系
在当今快速发展的智慧城市和数字化转型浪潮中,视频监控技术已成为提升公共安全、优化城市管理、增强应急响应能力的重要工具。EasyCVR视频监控平台以其强大的多协议接入能力和多样化的视频流格式分发功能,为用户提供了一个全面、灵活、高效的视频监控解决…...
Spark 中 RDD checkpoint 是通过启动两个独立的 Job 完成的。
在 Spark 中,RDD checkpoint 是通过启动两个独立的 Job 完成的。这两个 Job 分别用于生成 checkpoint 数据和更新依赖关系。下面从源码角度深入分析这个机制。 1. 为什么需要两个 Job? 当调用 RDD.checkpoint() 后: 第一个 Job:…...
如何下载TikTok视频没有水印
随着短视频平台的普及,TikTok(抖音国际版)成为了全球最受欢迎的社交媒体平台之一。它吸引了无数创作者发布自己的短视频内容,内容涵盖了舞蹈、搞笑、挑战、教程、旅行等各个方面。与此用户也常常希望能够下载自己喜欢的TikTok视频…...
天童美语:提升孩子的自信心的方法
每个孩子都渴望展翅高飞,但在成长的旅途中,难免会遇到风雨。不自信,就像一层薄雾,有时悄悄笼罩在孩子心头,阻碍了他们向阳而生的脚步。宁波天童教育认为,身为家长,我们的使命不仅是孩子的庇护伞…...
【网络编程】字节序:大端序和小端序
端序(Endianness),又称字节顺序,又称尾序,在计算机科学领域中,指存储器中或在数字通信链路中,组成多字节的字的字节的排列顺序。 在几乎所有的机器上,多字节对象都被存储为连续的字…...
视频融合×室内定位×数字孪生
随着物联网技术的迅猛发展,室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息,还能通过实时视频监控实现全方位数据的可视化。 与此同时,数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…...
RK3568平台开发系列讲解(platform虚拟总线驱动篇)注册 platform 驱动
🚀返回专栏总目录 文章目录 一、注册 platform 驱动二、platform_driver 结构体沉淀、分享、成长,让自己和他人都能有所收获!😄 一、注册 platform 驱动 platform_driver_register 函数用于在 Linux 内核中注册一个平台驱动程序。 下面是对该函数的详细介绍: 函数原型…...
Jmeter进阶篇(26)杀掉Tomcat的几种方法
📚Jmeter性能测试大全:Jmeter性能测试大全系列教程❤,这里有你想要的一切,欢迎订阅哦~ 📚前言 Tomcat 是一个广泛使用的开源 Java Servlet 容器,用于部署和运行 Java Web 应用程序。在我们进行压测测试过程中,很可能遇到被测系统崩溃,需要我们来操作一下子Tomcat的情…...
Solana 区块链的技术解析及未来展望 #dapp开发#公链搭建
随着区块链技术的不断发展和应用场景的扩展,性能和可拓展性成为各大公链竞争的关键因素。Solana(SOL)因其高吞吐量、低延迟和低成本的技术特性,在众多区块链项目中脱颖而出,被誉为“以太坊杀手”之一。本文将从技术层面…...
SMO算法-核方法支持向量机
我们现在的问题是要优化目标函数,同时求出参数向量 α \alpha α P m i n ⏟ α 1 2 ∑ i 1 , j 1 m α i α j y i y j K ( x i , x j ) − ∑ i 1 m α i s . t . ∑ i 1 m α i y i 0 0 ≤ α i ≤ C P\underbrace{ min }_{\alpha} \frac{1}{2}\sum\li…...
Java项目实战II基于微信小程序的科创微应用平台(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着科技的…...
HTTP代理是什么,有什么用?
在互联网的世界里,数据采集已经成为许多企业和个人获取信息的重要手段。而在这个过程中,HTTP代理则是一个不可或缺的工具。那么,HTTP代理究竟是什么?它在数据采集中又有什么用呢?今天,我们就来深入探讨一下…...
Postman之newman
Postman之newman 1.基础环境node安装1.1.配置环境变量1.2.安装newman和html报告组件 2.newman运行 newman可以理解为,没有命令行的postman,把写好的测试脚本直接在命令行中运行,newman依赖于node环境,因此,需要先安装好…...
数据库查询表结构和数据量以及占用空间
数据库查询表结构和数据量以及占用空间 数据库查询表结构 mysql SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, COLUMN_DEFAULT 默认值, COLUMN_COMMENT 备注 FROM INFORMATION_SC…...
android 性能分析工具(03)Android Studio Profiler及常见性能图表解读
说明:主要解读Android Studio Profiler 和 常见性能图表。 Android Studio的Profiler工具是一套功能强大的性能分析工具集,它可以帮助开发者实时监控和分析应用的性能,包括CPU使用率、内存使用、网络活动和能耗等多个方面。以下是对Android …...
vscode 执行 vue 命令无效/禁止运行
在cmd使用命令可以创建vue项目但是在vscode上面使用命令却不行 一、问题描述 在 cmd 中已确认vue、node、npm命令可以识别运行,但是在 vscode 编辑器中 vue 命令被禁止,详细报错为:vue : 无法加载文件 D:\Software\nodejs\node_global\vue.…...
C++语言系列-STL容器和算法
C语言系列-STL容器 容器类 本文将对C语言中的标准模板库STL容器进行简单介绍,重点在于如何使用。 容器类 STL中的容器包括以下类别: vector: 动态数组,底层基于数组来实现,在容量不足的时候能够自动进行扩容。list: 链表stack: …...
【Web前端】Promise的使用
Promise是异步编程的核心概念之一。代表一个可能尚未完成的操作,并提供了一种机制来处理该操作最终的成功或失败。具体来说,Promise是由异步函数返回的对象,能够指示该操作当前所处的状态。 当Promise被创建时,它会处于“待定”&a…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
