初始化提交
This commit is contained in:
233
问IA.md
Normal file
233
问IA.md
Normal file
@@ -0,0 +1,233 @@
|
||||
我现在有一个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
|
||||
Reference in New Issue
Block a user