fix: Xvfb 管道挂死根因修复 + 日报窗口 mtime 兜底 + 翻译切换 dashscope

- domestic_crawl_8g.sh: Xvfb 启动脱离管道 fd(</dev/null + 重定向日志 + disown)。
  修复 2026-09-06 事故:Xvfb 常驻进程继承 'bash crawl | tee' 管道写端,
  tee 永远收不到 EOF → domestic_full.sh 卡死 M1 → 日报永不生成
- scheduler/reporter.py: _load_events_window 对 'publish_time 过期' 的文件
  增加 mtime 兜底(本次窗口内新翻译的事件不被低质量 publish_time 误伤)。
  修复空日报:date-only/美式日期错位的 publish_time 使窗口 articles=0
- configs/system.yaml: M4 翻译 provider 切换 deepseek → dashscope(qwen3.7-flash),
  降低翻译成本(输出单价约降 ~9 倍);daily_report 保持 deepseek 不变
This commit is contained in:
2026-09-06 11:52:31 +08:00
parent c1ab751d95
commit e9f8ef13ef
3 changed files with 26 additions and 6 deletions
+6 -3
View File
@@ -23,6 +23,8 @@ crawler:
source_timeout_sec: 7200 # 单源超时秒数(2h) source_timeout_sec: 7200 # 单源超时秒数(2h)
article_delay_sec: 3.0 # 文章间冷却间隔 article_delay_sec: 3.0 # 文章间冷却间隔
page_timeout_sec: 45 # 单页加载超时 page_timeout_sec: 45 # 单页加载超时
http_timeout_sec: 30 # 轻量 HTTP 抓全文单页超时(秒)
http_min_html_len: 2000 # 判定 HTTP 拿到正文的最小 HTML 长度
viewport_width: 1024 viewport_width: 1024
viewport_height: 768 viewport_height: 768
user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
@@ -45,7 +47,7 @@ dedup:
llm: llm:
provider: "deepseek" provider: "deepseek"
deepseek_model: "deepseek-v4-flash" deepseek_model: "deepseek-v4-flash"
qwen_model: "qwen-plus" qwen_model: "qwen3.7-flash"
timeout_sec: 60 timeout_sec: 60
max_attempts: 3 # 单篇总尝试次数(含首次),失败后指数退避重试 max_attempts: 3 # 单篇总尝试次数(含首次),失败后指数退避重试
max_tokens: 8192 max_tokens: 8192
@@ -58,8 +60,9 @@ llm:
llm_scenes: llm_scenes:
translation: translation:
# M4:全文英译中 + 投资事件抽取(单次 LLM 调用合并输出) # M4:全文英译中 + 投资事件抽取(单次 LLM 调用合并输出)
provider: "deepseek" #provider: "deepseek"
model: "deepseek-v4-flash" provider: "dashscope"
model: "qwen3.7-flash"
temperature: 0.1 temperature: 0.1
max_tokens: 8192 max_tokens: 8192
description: | description: |
+11 -1
View File
@@ -243,7 +243,17 @@ def _load_events_window(now: datetime) -> list[dict]:
continue continue
if pt < cutoff: if pt < cutoff:
continue # publish_time 质量兜底:部分源(zerohedge/cnbc 等)publish_time
# 仅日期(按 00:00 UTC 处理)或美式日期错位(如 09/05 → 5 月 9 日)。
# 这类文章在报告非 07:00 运行时易被 25h 窗口误伤。若事件文件本身
# 是窗口内新生成的(mtime ≥ cutoff,即本次管道刚翻译),予以保留。
# (2026-09-06 空日报事故教训:窗口 articles=0 → AI 摘要为空)
try:
mtime = datetime.fromtimestamp(fp.stat().st_mtime, tz=UTC)
except OSError:
mtime = None
if mtime is None or mtime < cutoff:
continue
articles.append(data) articles.append(data)
except (json.JSONDecodeError, OSError): except (json.JSONDecodeError, OSError):
pass pass
+9 -2
View File
@@ -9,7 +9,7 @@
# #
# 前置条件: # 前置条件:
# sudo apt install xvfb # sudo apt install xvfb
# Xvfb :99 -screen 0 1280x1024x24 & # 首次启动 # Xvfb :99 -screen 0 1280x1024x24 </dev/null >> logs/xvfb.log 2>&1 & # 首次启动
# HTTP 代理 127.0.0.1:3128 已运行(privoxy) # HTTP 代理 127.0.0.1:3128 已运行(privoxy)
# #
# 用法: # 用法:
@@ -40,9 +40,16 @@ if [ -f .env ]; then
fi fi
# ── 启动 Xvfb(如果尚未运行)── # ── 启动 Xvfb(如果尚未运行)──
# ⚠️ Xvfb 的 stdin/stdout/stderr 必须脱离本脚本的 fd 并重定向到日志文件:
# 本脚本常被 `bash xx.sh | tee` 管道包裹调用(domestic_full.sh),而 Xvfb
# 是常驻进程(设计为跨运行复用)。若它继承了管道写端,抓取脚本退出后
# tee 仍永远收不到 EOF → domestic_full.sh 卡在 M1 → [2/2] 管道与日报
# 永不执行(2026-09-06 早报缺失事故根因)。
if ! pgrep -x "Xvfb" > /dev/null; then if ! pgrep -x "Xvfb" > /dev/null; then
LOG "启动 Xvfb 虚拟显示器 :99 ..." LOG "启动 Xvfb 虚拟显示器 :99 ..."
Xvfb :99 -screen 0 1280x1024x24 -ac +extension RANDR & mkdir -p logs
Xvfb :99 -screen 0 1280x1024x24 -ac +extension RANDR </dev/null >> logs/xvfb.log 2>&1 &
disown 2>/dev/null || true
sleep 1 sleep 1
LOG "Xvfb 已启动 (PID: $(pgrep -x Xvfb))" LOG "Xvfb 已启动 (PID: $(pgrep -x Xvfb))"
else else