我现在有一个python爬虫项目启动是在项目目录内手动:python update_yt_week.py > output_week.log 2>&1 &,产生的进程日志就放在output_week.log文件内。 现在有问题就是这个进程会直接中断结束,我需要有方法自己检测这个进程,有什么方法思路或者工具,我初步的想法:有一个东西可以每10分钟检查改进程,假如没有进程就执行启动命令,执行完启动后每10秒重新检查进程是否启动,假如连续3次没有检查到重新启动的进程,就再次立即执行启动命令,连续3次执行启动命令且则进程都检查不到说明python项目有问题则整体停止这个检查工具。 你有什么方式方法实现吗?不用写具体的脚本代码给我,就说有什么方法思路方式工具可以实现,并且需要保留日志文件,pyhton脚本本身的日志文件,以及该工具执行检查启动相关动作的日志文件,并且最好这两个文件能够按天分割成不同文件。 is_running() { pgrep -f "python update_yt_week.py" > /dev/null 2>&1 return $? } pgrep -f "python update_yt_week.py" | head -n 1 ----------------------------------------------------- 当前项目: 机器A:43.159.145.241: 安装了tengine,部署了前端文件、运行了python项目5001端口,本机的5001负责接收前端页面的请求,再由python项目的代码请求别的机器上的jar包服务, tengine配置文件主要为 server { listen 443 ssl; server_name jennie.deal www.jennie.deal; ssl ... ... location / { root /data/tengine/html/jennie_web/dist/; index index.html index.htm; try_files $uri $uri/ /index.html; } location /prod-api/ { proxy_pass http://127.0.0.1:5001; proxy_set_header Host $host; ... } } python项目调用后端jar的配置: [api] # 远程API基础URL api_base_url = http://129.204.158.54:8070/prod-api/ # 目标服务器 target_server_8070 = http://129.204.158.54:8070 机器B和C在同个局域网:BC都运行了相同的jar包作为机器A的jar后端 机器B: 公网:129.204.158.54,内网为:172.24.16.10 机器C:公网:43.138.204.95,内网为:172.24.16.7 机器B安装了tengine,配置负载均衡: upstream agent_backend { server 127.0.0.1:8070 max_fails=3 fail_timeout=30s; server 172.24.16.7:8070 max_fails=3 fail_timeout=30s; keepalive 300; } server { listen 8070; location / { proxy_pass http://agent_backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; ... } } 现在查看机器BCjar的日志,只有机器B,有机器C没有,说明机器A的前端页面的接口都是访问的机器B,负载均衡没起作用,为什么怎么办?能给单独一个sever块的产生的日志单独产生到另外的日志文件吗? python脚本查询es TARGET_EVENT = "达人搜索" query = { "query": { "bool": { "filter": [ {"term": {"mylog.module": "business"}}, {"term": {"mylog.level": "warning"}}, {"wildcard": {"mylog.tail.keyword": f"*[event: {TARGET_EVENT}]*"}}, {"range": { "@timestamp": { "gte": start_time.isoformat(), "lte": end_time.isoformat() } }} ] } }, "sort": [{"@timestamp": "desc"}], "size": 1, "track_total_hits": True } 注释{"wildcard": {"mylog.tail.keyword": f"*[event: {TARGET_EVENT}]*"}}, 就得到,加上就查不到 日志原本的样子:2025-06-12 18:11:48 - business - WARNING - [user_email: 302866617a@gmail.com] [conversation_id: d998dc11-d7a9-4817-8e90-e208454c80a1] [event: 达人搜索 | msg: 处理完成,耗时: 1.43秒,未找到匹配达人 | context: duration:1.43s,results_count:0] mylog.tail字段是 [event: 达人搜索 | msg: 处理完成,耗时: 1.43秒,未找到匹配达人 | context: duration:1.43s,results_count:0] echo "2025-06-12 19:16:48 - business - WARNING - [user_email: 123@gmail.com] [conversation_id: 123-d7a9-4817-8e90-e208454c80a1] [event: 达人搜索 | msg: 这是测试的,耗时: 9.13秒,匹配71个达人 | context: duration:9.13s,results_count:71]" >> influencer_search_20250612_184513.log 现在我的ai对话产品有4个套餐等级:Free、Basic、Pro、Max,格式是:“套餐(月付价格,年付平均月价,每月积分)” Free: ($0,$0,60) Basic:($99.00,$84.90,1000) Pro:($199,$169,2500) Max:($299,$259,6000) 以下是套餐按钮交互逻辑补充: - 用户当前订阅了任意一个套餐 - 订阅月度套餐 - 允许用户切换不同套餐类型 - 订阅的是Basic套餐 - 月度套餐界面 - Free套餐按钮:Unavailable - Basic套餐显示:Current Plan - Pro以及Max显示:Upgrade to Pro & Max - 年度套餐界面 - Free套餐按钮:Unavailable - Basic套餐显示:Switch to Basic (Yearly) - Pro以及Max显示:Upgrade to Pro & Max - 订阅是Max(最高级别)套餐 - 月度套餐界面 - Free套餐按钮:Unavailable - Basic以及Pro显示:Downgrade to Basic & Pro - (下个月生效) - Max套餐显示:Current Plan - 年度套餐页面 - Free套餐按钮:Unavailable - Basic显示: - Pro套餐显示: - Max套餐显示:Switch to Max (Yearly) - 用户订阅的年度套餐 - 年度basic套餐 - 月度套餐页面 - Free套餐按钮:Unavailable - 所有套餐按钮均为Unavailable - 鼠标hover显示:Switching from annual to monthly isn’t supported directly. If you accidentally purchased an annual plan, contact us at support@lessie.ai and we’ll process your refund. - 不允许用户自己从年度切换回月度 - 年度套餐页面 - Free套餐按钮:Unavailable - Basic显示:Current Plan - Pro和Max套餐显示: Upgrade to Pro & Max - 点击之后直接进入check out页面,补足差价 - 年度Pro套餐 - 月度套餐页面 - Free套餐按钮:Unavailable - 年度套餐页面 - Basic以及Max显示:Downgrade to Basic & Pro - Pro:Current Plan - 年度Max套餐 - Basic以及Pro显示:Downgrade to Basic & Pro - Max:Current Plan 当前套餐:按钮文案为 Current Plan(不可点击) 升级套餐:按钮文案格式为 Upgrade to Plus / Pro / Max 降级套餐: 1. 若用户当前套餐为 Plus 或 Pro,且页面中出现低版本套餐(如 Basic),按钮文案为: Switch to Basic 2. 若用户降级至免费套餐(假设 Basic 为免费版时),则按钮文案建议为: Downgrade to Basic / Plus / Pro 我补充一下套餐流转的规则: 1、升级套餐:更新订阅周期,立即生效,积分补足至新版套餐标准 示例:用户升级前积分剩余500,生成Pro后,积分补足到2500 2、套餐降级:下一个订阅周期生效,用户退款全部人工处理 订阅周期以当前用户的订阅情况来计算 示例: 用户当前购买套餐为 月付Pro版,订阅有效期为2025-08-01至2025-09-01,用户08-15修改套餐为 月付Basic版 则 月付Basic版 的生效日期为2025-09-01 下一个订阅周期生效 3、低套餐升级到高套餐 及时生效 更新下次扣款日期 从用户付款日开始 收新版本套餐的金额,减去上个月 差价金额 = 高级版金额 - 当月积分消耗比例 × 无折扣(用户付款时)的月付价格 现在前端页面的请求请求到go服务,前端的nginx配置文件upstream go_backend { ip_hash; server 10.0.0.10:8100 weight=10 max_fails=3 fail_timeout=30s; server 10.0.0.8:8100 weight=10 max_fails=3 fail_timeout=30s; },然后go服务会请求python服务,现在python服务是有5台机器运行了5个实例,第二个nginx配置文件upstream app_lessie_ai_backend { ip_hash; server 10.0.0.12:7001 weight=10 max_fails=3 fail_timeout=30s; server 10.0.0.7:7001 weight=10 max_fails=3 fail_timeout=30s; server 10.0.0.11:7001 weight=10 max_fails=3 fail_timeout=30s; server 10.0.0.2:7001 weight=10 max_fails=3 fail_timeout=30s; server 10.0.0.13:7001 weight=10 max_fails=3 fail_timeout=30s; }。前端正常使用的时候,go再请求到python,但是python的nginx负载视角看永远是go服务这个IP在请求它,导致一直只有一台python服务机器在接受请求,怎么办,怎么才能让真正的浏览器用户,可以负载到不同python服务机器,且同一个用户短时间尽量请求同一个python。 前端nginx的日志格式:log_format app_lessie_ai_log '客户端IP: $remote_addr | 用户: $remote_user | 时间: $time_local | ' '请求方法和路径: "$request" | 状态码: $status | 响应大小: $body_bytes_sent | ' '来源页面: "$http_referer" | 客户端UA: "$http_user_agent" | ' '上游服务器: $upstream_addr | 上游响应耗时: $upstream_response_time | ' '请求总耗时: $request_time | Host: $host'; 查看日志,筛选出访问go服务的实际日志内容: 客户端IP: 172.69.134.19 | 用户: - | 时间: 23/Sep/2025:20:20:41 +0800 | 请求方法和路径: "GET /api/searches/v1/18d2fad9-12b6-4f91-80fb-7304adf0bcd7?share_id=1QWYc5L8mBQofb8DWw6ReY HTTP/1.1" | 状态码: 200 | 响应大小: 880236 | 来源页面: "https://app.lessie.ai/showcase/1QWYc5L8mBQofb8DWw6ReY" | 客户端UA: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36" | 上游服务器: 10.0.0.8:8100 | 上游响应耗时: 0.163 | 请求总耗时: 0.168 | Host: app.lessie.ai 客户端IP: 172.69.134.19 | 用户: - | 时间: 23/Sep/2025:20:20:41 +0800 | 请求方法和路径: "GET /api/searches/v1/18d2fad9-12b6-4f91-80fb-7304adf0bcd7?share_id=1QWYc5L8mBQofb8DWw6ReY HTTP/1.1" | 状态码: 200 | 响应大小: 880230 | 来源页面: "https://app.lessie.ai/showcase/1QWYc5L8mBQofb8DWw6ReY" | 客户端UA: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36" | 上游服务器: 10.0.0.8:8100 | 上游响应耗时: 0.141 | 请求总耗时: 0.146 | Host: app.lessie.ai 客户端IP: 172.69.134.19 | 用户: - | 时间: 23/Sep/2025:20:20:41 +0800 | 请求方法和路径: "GET /api/searches/v1/18d2fad9-12b6-4f91-80fb-7304adf0bcd7?share_id=1QWYc5L8mBQofb8DWw6ReY HTTP/1.1" | 状态码: 200 | 响应大小: 880222 | 来源页面: "https://app.lessie.ai/showcase/1QWYc5L8mBQofb8DWw6ReY" | 客户端UA: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36" | 上游服务器: 10.0.0.8:8100 | 上游响应耗时: 0.356 | 请求总耗时: 0.355 | Host: app.lessie.ai 客户端IP: 172.71.155.24 | 用户: - | 时间: 23/Sep/2025:20:22:12 +0800 | 请求方法和路径: "GET /api/conversation/v1?page_num=1&page_size=3&keyword=&is_filter_hidden=true HTTP/1.1" | 状态码: 200 | 响应大小: 127 | 来源页面: "https://app.lessie.ai/" | 客户端UA: "Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.7 Mobile/15E148 Safari/604.1" | 上游服务器: 10.0.0.10:8100 | 上游响应耗时: 0.209 | 请求总耗时: 0.209 | Host: app.lessie.ai python 服务的nginx的日志格式: upstream prod_py_search { #ip_hash; hash $http_x_forwarded_for consistent; server 10.0.0.12:7001 weight=10 max_fails=3 fail_timeout=30s; server 10.0.0.7:7001 weight=10 max_fails=3 fail_timeout=30s; server 10.0.0.11:7001 weight=10 max_fails=3 fail_timeout=30s; server 10.0.0.2:7001 weight=10 max_fails=3 fail_timeout=30s; server 10.0.0.13:7001 weight=10 max_fails=3 fail_timeout=30s; } log_format prod_py_search_log '客户端IP: $remote_addr | 用户: $remote_user | 时间: $time_local | ' '请求方法和路径: "$request" | 状态码: $status | 响应大小: $body_bytes_sent | ' 'XFF: "$http_x_forwarded_for" | 客户端UA: "$http_user_agent" | ' '上游服务器: $upstream_addr | 上游响应耗时: $upstream_response_time | ' '请求总耗时: $request_time | Host: $host'; python服务的nginx日志内容: 客户端IP: 10.0.0.8 | 用户: - | 时间: 23/Sep/2025:20:20:40 +0800 | 请求方法和路径: "GET /internal/search/18d2fad9-12b6-4f91-80fb-7304adf0bcd7 HTTP/1.1" | 状态码: 200 | 响应大小: 868211 | XFF: "-" | 客户端UA: "Go-http-client/1.1" | 上游服务器: 10.0.0.13:7001 | 上游响应耗时: 0.088 | 请求总耗时: 0.088 | Host: 10.0.0.3 客户端IP: 10.0.0.8 | 用户: - | 时间: 23/Sep/2025:20:20:40 +0800 | 请求方法和路径: "GET /internal/search/18d2fad9-12b6-4f91-80fb-7304adf0bcd7 HTTP/1.1" | 状态码: 200 | 响应大小: 868211 | XFF: "-" | 客户端UA: "Go-http-client/1.1" | 上游服务器: 10.0.0.13:7001 | 上游响应耗时: 0.103 | 请求总耗时: 0.103 | Host: 10.0.0.3 客户端IP: 10.0.0.8 | 用户: - | 时间: 23/Sep/2025:20:20:40 +0800 | 请求方法和路径: "GET /internal/search/18d2fad9-12b6-4f91-80fb-7304adf0bcd7 HTTP/1.1" | 状态码: 200 | 响应大小: 868211 | XFF: "-" | 客户端UA: "Go-http-client/1.1" | 上游服务器: 10.0.0.13:7001 | 上游响应耗时: 0.107 | 请求总耗时: 0.107 | Host: 10.0.0.3 客户端IP: 10.0.0.8 | 用户: - | 时间: 23/Sep/2025:20:20:41 +0800 | 请求方法和路径: "GET /internal/search/18d2fad9-12b6-4f91-80fb-7304adf0bcd7 HTTP/1.1" | 状态码: 200 | 响应大小: 868211 | XFF: "-" | 客户端UA: "Go-http-client/1.1" | 上游服务器: 10.0.0.13:7001 | 上游响应耗时: 0.084 | 请求总耗时: 0.084 | Host: 10.0.0.3 客户端IP: 10.0.0.8 | 用户: - | 时间: 23/Sep/2025:20:20:41 +0800 | 请求方法和路径: "GET /internal/search/18d2fad9-12b6-4f91-80fb-7304adf0bcd7 HTTP/1.1" | 状态码: 200 | 响应大小: 868211 | XFF: "-" | 客户端UA: "Go-http-client/1.1" | 上游服务器: 10.0.0.13:7001 | 上游响应耗时: 0.293 | 请求总耗时: 0.294 | Host: 10.0.0.3