前四轮工作流线都在逛货架:部署件、CI件、监控件、编队列,拆的都是「市场上卖什么」。本期反过来,开后台柜:把这条日夜运转的内容产线自己装的四件后台件全部首拆——执行位 task_runner.sh v3、审计闸 dedup_gate.py、发布闸 publish.sh v4、监控位 watchdog.sh,四件全部实读源码,逐段对账。核心发现一句话:货架四席卖的全是「会调 API 的手」,后台四件凑出来的恰恰是货架最缺的东西——制度。 退出码协议、三层查重、fail-open 审计、token 窗口换班制,没有一样能 npm install。更有意思的是一份五个月的进化证据:五月版执行器里拒了稿没人签收,九月版签收了。制度不是设计出来的,是踩坑踩出来的。
flowchart TD
WD["watchdog 每30分钟巡检"] -->|进程消失| MS["master.sh 排班"]
WD -->|满4小时新窗口| RS["清账本 换班重开"]
MS --> TR["task_runner v3 当班"]
TR -->|禁写盘 只收stdout| ART["稿件初稿"]
ART --> DG["dedup_gate 查重闸"]
DG -->|0 通过| PB["publish.sh 发布闸"]
DG -->|2 判重| RJ["弃稿并记黑名单"]
DG -->|3 闸坏放行| PB
PB --> IDX["登记标题索引"]
PB --> PG["重建分页 后台预渲染"]
DR["generate_daily 收工日报"] --> PB
四件后台件没有一件直接「生产内容」:执行位管跑、审计闸管拦、发布闸管上线、监控位管换班。货架上的件拼的是能力,后台四件拼的是秩序。
| 件(工位) | 功能完整度(25%) | 设计质量(25%) | 实战效果(20%) | 上手难度(15%) | 在产/迭代(15%) | 加权 |
|---|---|---|---|---|---|---|
| watchdog.sh(监控位) | ★★★★ | ★★★★ | ★★★★★ | ★★★★ | ★★★★ | 4.2 |
| dedup_gate.py(审计闸) | ★★★★ | ★★★★★ | ★★★★ | ★★★★ | ★★★ | 4.1 |
| task_runner.sh v3(执行位) | ★★★★★ | ★★★★ | ★★★★★ | ★★ | ★★★ | 4.0 |
| publish.sh v4(发布闸) | ★★★★ | ★★★★ | ★★★★ | ★★★★ | ★★★★ | 4.0 |
口径先立规矩:实战效果以「是否在产线调用链持续在岗」为唯一证据,四件全部在岗五个月以上,此项可完全核实;上手难度反向计分,分高=易上手;「在产/迭代」是自用件的社区活跃度替身,依据是各文件内部留存的版本注释日期(下文逐一引证)。四件分数咬得极近,后台件的世界没有明星,只有同事。
文件头第二段就是全文最值钱的一行注释:# Returns: 0=success, 3=rate-limited(429), other=failure。这不是文档装饰——master 排班层真的按这三个值分岔:0 记成功、3 触发限流例程、其余记失败。回执有了编号,闸和账本才算接上了话。
它的第二个制度是所有权分离:调用模型时挂着 --disallowedTools "Write Edit NotebookEdit"——模型被禁止写盘,正文只能从 stdout 吐出来,落盘路径、文件名、归档全部由脚本说了算。部分发现页数据先行到位的栏目,连网页抓取工具也在禁用清单里,权限按任务最小化。产物落盘后还有一套验收线:体积必须大于 200 字节,首行必须是标题注释或一级标题,前三行出现「API Error」直接判废。
第三套制度是进料纪律:提示词末尾按固定顺序拼进今日已写标题、拒稿黑名单、全局历史三个查重块——先把「不许写什么」喂进去,比事后拦便宜得多。小 Glossary 栏目甚至有一个 mkdir 实现的自旋锁加游标文件:拿锁最多等 15 秒,抢不到就强行破门,然后按游标跳过所有已写过的名词及其英文缩写变体。
瑕疵也如实记档:v3 里有两段在 UTF-8 终端下读不出来的乱码模板段(一段是二轮改稿指令、一段是搜索角度池),每天照常被拼进提示词,模型看不懂,产线照常跑——最典型的一笔技术债,没人回头审模板。另有一处死代码:mermaid 渲染调用被注释停用后,render_exit=$? 接住的是上一条日志命令的返回值,永远是 0。
昨天本栏对过账:验收岗、发薪岗、审计岗,货架上三十七席没人坐。今天开后台柜发现,审计岗的前半张桌子其实早有主——这台查重闸九月十四日就上线了,两段式:脚本初筛(标题做中文二元组,Jaccard 相似度 0.50 或 difflib 0.60 以上列为疑似,最多取前三对)+ 大模型终审(疑似对交给 claude CLI,只许输出一行 REPEAT 或 OK 加二十字理由,超时 180 秒)。
最有价值的是它的退出码三态:0 放行、2 判重拒稿、3 内部错误——放行。注释写得直白:「放行,不阻塞产线」。审计闸的第一设计原则不是严格,是可用性:闸自己坏了不能把整条线憋死。与之配套的是黑名单回流:被判 REPEAT 的标题写进 rejected_titles.txt,而这份名单又被执行位拼进每天每篇的提示词当最高优先级禁令——拒过的稿会变成后来的稿不许踩的线,审计结果反哺选题,这是货架件里没有见过的闭环。
终审判词本身也值得抄走:「同一事件/同一产品/同一技术点且角度雷同算重复;仅同领域不同事件不算。」二十几个字,把「重复」的定义钉死在事件与角度上,而不是词面上。九月二十日到二十五日五天里,闸上又加装了三道精确快闸:同名标题直接拒、telecom 系栏目同术语只许一篇、games 栏目同仓库只许一篇——模糊层之前先走精确层,能不惊动大模型就不惊动。要说边界:它判的是选题重复,不是交付质量,「稿子写得好不好」那张考卷,货架上和产线上都还没人出。
发布闸干五件事:按栏目路由目标目录(telecom-3gpp 还会解析文章内部的 domain 注释二次分流)、标题精确查重兜底(命中索引立即 REJECTED-DUPLICATE-TITLE 并 exit 1)、补页脚、往栏目 README 的「最新文章」下插链接并把列表裁到五十条、后台异步跑预渲染刷新 sitemap。
最讲究的是登记时序:标题索引的登记动作放在文件拷贝成功之后,注释原话是「发布成功登记标题,防索引陈旧复发」——先上车后补票,反过来就会出现「索引里有、站上没有」的鬼文章,查重闸会永远拒掉一个其实没发过的选题。顺序即正确性,这一行注释值一次事故复盘。预渲染用后台子进程异步跑、失败静默,也是同一个取向:发布闸不因装饰性步骤阻塞。
债务同样清楚:youtube 栏目的 domain 分流里 design 和 health 两个分支各写了两遍——publish.sh 和执行位各错了一处,复制粘贴的案底留在了两个文件里。另外整个发布闸只有「上」没有「下」,不存在 unpublish,发错的文章只能手工删。
货架监控位的老住户 sentry 被本栏判过「睡着」,因为监控件普遍只报数不行动。产线这台看门狗相反,它只有一件事:踹门。crontab 写死 17,47 * * * *——每半小时巡一次,刻意避开整点;进来先用 pgrep 查排班长是否在岗,在岗就走人。不在岗时分四种情况落日志再动手:没有状态文件、跨入了新的一天、任务没跑完进程死了——直接重启;以及最有意思的第四种:今天的活干完了,但距离上次收工已满四小时——注释写着「GLM 每 5 小时重置,取 4 小时做阈值」,于是清空已完成/已失败账本、周期计数加一、换班重开。token 窗口被当成了班次,限流不是异常,是作息表。
一处耐人寻味的留痕:周末与晚间静默期的判断代码还完整留在文件里,但条件被写死成 if false 停用了——功能关了,决策现场保留。短板也明摆着:它踹门只写 watchdog.log,没有任何外呼通道,半夜重启十次,没有人会知道——监控位的最后一公里(通知)还空着。
后台柜里压着一份五月十六日的旧版执行器(backup_v1,1.6KB)。它调用发布闸之后不检查退出码,拒稿发生时照样打出「Task completed」;文件最后一行是注释 # Record in history,注释下面没有代码——一个没兑现的承诺。五月版的产线:闸会拒稿,但没人签收回执,账本把被拒的稿记成完稿。
九月二十日的 v3(19KB)把这个坑填上了:查重闸返回 2,执行器弃稿、记日志、exit 1——回执进了协议,账本不会再把废稿记成业绩。加上渲染工装从构建期挪去了浏览器端(构建位退休)、退出码协议写进文件头,五个月里这套后台长了三样东西:闸、回执、时序。货架件至今没有这三样,不是工程师不会写,是制度没法预先设计,只能踩坑长出来——而货架的商业模式恰恰只允许卖「一次装好」的能力,不允许卖「挨过打」的伤疤。
# 招式一:把退出码协议写进脚本头,调用方按码分岔
# Returns: 0=success, 2=rejected, 3=gate-broken(pass)
python3 gate.py "$ARTICLE"; rc=$?
case $rc in 0) bash publish.sh "$ARTICLE";; 2) rm "$ARTICLE";; 3) bash publish.sh "$ARTICLE";; esac
# 招式二:审计闸 fail-open——闸坏了放行,绝不静默吞稿
# 招式三:把资源窗口当班次——满 N 小时清账本、周期+1、重开
配一条 SKILL.md,让闸可以被人话召唤:
---
name: publish-gate
description: 发布前对稿件执行查重与登记。当用户说「发布」「发出去」「上线这篇」时使用。闸只判放行或拒稿,不改稿。
---
1. 先跑精确层(同名/同术语/同仓库索引),再跑模糊层(相似度初筛+终审单判词)
2. 退出码协议:0=放行 2=拒稿 3=闸坏放行,禁止任何静默路径
3. 拒稿写入黑名单,黑名单回流到选题提示词
4. 登记索引必须在发布成功之后
第五轮把镜头从货架转向后台,结论反而更清楚了:部署、CI、监控、编队四个席位上,市场卖的全是「接活的手」;而一条产线真正能日夜运转,靠的是后台那几样不起眼的制度——回执有编号、闸坏了放行、登记在发布之后、限流当班次。这四样今天在货架上一样都买不到,因为它们全是伤疤的化石。下注方向依旧写在墙上:谁把「挨过打的制度」封装成件,谁就补上了货架与产线之间最宽的那道缝。
task_runner.sh(v3,含退出码协议与查重回执逻辑)、publish.sh(v4)、dedup_gate.py、watchdog.sh、generate_daily.sh、backup_v1/task_runner.sh(五月旧版) — 本文全部代码引用,实读于产线环境[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
