CH 15 · 定时任务与后台运行
本章目标
这一章解决一个问题:怎么让 Agent"到点自己干活"。
dsh 里的"定时"有两个层面,容易混:
| 层面 | 是什么 | 典型场景 |
|---|---|---|
| 会话内提醒(官方 Schedule) | 在同一个会话里让模型"过 X 分钟提醒我" | "20 分钟后提醒我回来看结果" |
| 系统级自动化(headless + 定时器) | 整个 Agent 跑完一个任务就退出,由操作系统定时器到点拉起 | "每天早上 9 点自动给我发一份 AI 热点" |
前半章把官方 Schedule 讲清楚(它是个可选 overlay,本文给你一份直接可用的用户指南);后半章才是这章的重点实操——用 CH 14 装好的 aihot skill,做一个"到点自动抓 AI 热点"的定时任务。
官方 Schedule:会话内的定时提醒
是什么
官方包 @deepseek-ai/dsh-schedule 提供的是会话内提醒:让模型在同一个会话里"稍后提醒我"。到期时,它作为一条普通 follow-up 消息回到这个会话。
它是可选能力(overlay),默认没开。要启用,启动 dsh web 时加一个 patch。官方示例在官方仓库的 apps/cli/config/examples/schedule/cordis.yml——那条相对路径命令要在clone 了官方仓库的根目录跑才有效,npm 装好 dsh 后是直接用不了的。不 clone 仓库也行,自己建一个等价的 patch 文件,内容就三段(我直接按官方示例抄了一份):
# schedule.overlay.yml
- insert:
- id: time-context
name: '@deepseek-ai/dsh-time-context'
- id: schedule
name: '@deepseek-ai/dsh-schedule'
- id: ui-schedule
disabled: false然后启动时指向这个文件:
dsh web --patch C:\你的路径\schedule.overlay.yml它做的事就三件:加 dsh-time-context(让模型按你浏览器时区理解时间)、加 dsh-schedule(提供提醒工具)、启用 ui-schedule(界面里显示待处理提醒)。
怎么用
启用后,新开会话,模型手里就有三个工具:
| 工具 | 干什么 |
|---|---|
schedule_create | 创建提醒 |
schedule_list | 列出所有待处理提醒 |
schedule_delete | 按 id 取消 |
创建提醒有三种规则:
| 规则 | 说明 |
|---|---|
after | 多少秒后提醒一次(一次性) |
at | 到某个具体时刻提醒一次(一次性) |
every | 固定间隔重复,下限 5 分钟 |
用法就是一句自然语言,比如"20 分钟后提醒我检查部署结果",模型会调 schedule_create 并返回提醒的 id、目标时间和状态。
边界
| 能做到 | 做不到 |
|---|---|
| 会话内 follow-up 消息提醒 | 没有邮件 / 短信 / 推送 / 浏览器通知 |
| 重启后提醒还在(存进会话日志) | 没有"每个工作日 9 点"这类日历 / Cron 规则 |
| 固定间隔重复(≥5 分钟) | 会话关着就保持逾期,恢复后只补最新一次 |
一句话记:官方 Schedule 管"会话里到点提醒你",不是"后台自动跑任务"。想要后者——也就是后半章要做的定时热点——就得用 headless 挂系统定时器。
重点实操:让 aihot 每天早上给你发 AI 热点
思路
CH 14 我们装好了 aihot(抓 AI 热点的检索 skill),CH 05 我们学会了 headless(一条命令跑一个任务,跑完即退)。把两件事拼起来,再加一个"到点拉起"的定时器,就是一个完整的定时热点任务:
headless 用 aihot 抓热点 → 写成文件 → 系统定时器每天早上 9 点把这条命令再跑一遍
第 1 步:先手动跑一次,确认能出结果
别一上来就上定时器,先手动跑通。先在你想放产出文件的工作区打开终端,我这里是 E:\software-workspace\DeepSeek harness demo:
cd "E:\software-workspace\DeepSeek harness demo" # 换成你的工作区
dsh --profile headless "用 aihot 这个 skill 抓取过去 24 小时的中文 AI 热点资讯,整理成一份简短的今日 AI 热点摘要(5 条左右,每条一句话加来源),写入文件 dsh-daily-hot.txt"
aihot 装在用户级货架(~/.agents/skills/aihot),headless 也能发现它,不用额外配置。执行完,一份 5 条的今日热点摘要就写进了 dsh-daily-hot.txt:

跑的时候我这边环境有个小插曲:本机 PowerShell 的 schannel 在做 HTTPS 握手时报了 SEC_E_NO_CREDENTIALS(沙箱里缺 TLS 凭据)。dsh 没卡死,模型会自动改用 OpenSSL 通道完成请求(具体用 Node 还是 Python,看它当时的判断),数据正常拿到。你机器上大概率不会遇到;真遇到,知道这是 TLS 通道问题、不是数据源故障就行。
第 2 步:把命令包进一个启动脚本
直接让定时器调一大串带引号的 headless 命令容易出错(引号嵌套、工作目录不对)。稳妥做法是写一个小脚本,脚本负责"切到目标目录 → 跑 headless"。
在你想要跑定时任务的工作区新建一个 run-daily-hot.ps1。我这里用的目录是 E:\software-workspace\DeepSeek harness demo,脚本里的 Set-Location 换成你自己的:
Set-Location "E:\software-workspace\DeepSeek harness demo" # 换成你的工作区
dsh --profile headless "用 aihot 这个 skill 抓取过去 24 小时的中文 AI 热点资讯,整理成今日 AI 热点摘要(5 条左右),写入文件 dsh-daily-hot.txt"先手动跑一次这个脚本(把路径换成你自己的),确认它和直接敲命令效果一样:
powershell -ExecutionPolicy Bypass -File "E:\software-workspace\DeepSeek harness demo\run-daily-hot.ps1"第 3 步:交给系统定时器
Windows 自带"任务计划程序",命令行用 schtasks 就能建。让它每天早上 9 点跑这个脚本:
schtasks /Create /SC DAILY /ST 09:00 /TN "DSH Daily AI Hot" /TR "powershell -ExecutionPolicy Bypass -File \"E:\software-workspace\DeepSeek harness demo\run-daily-hot.ps1\""| 参数 | 含义 |
|---|---|
/SC DAILY | 每天执行 |
/ST 09:00 | 早上 9 点 |
/TN | 任务名 |
/TR | 真正执行的命令(这里调的是第 2 步的脚本) |
建完可以顺手验证一次,不等明天:
schtasks /Run /TN "DSH Daily AI Hot"然后看 dsh-daily-hot.txt 的时间戳是不是更新成了刚才。
第 4 步:怎么"发送给我"
headless 的产出是写文件——每天早上到点,dsh-daily-hot.txt 就是当天最新的一份热点,你打开工作区就能看到。这是零成本的核心闭环。
想推到手机上,还有两条路:
- 装社区定时插件 dsh-scheduler:它支持 cron 触发,并把结果投递到 ServerChan / 钉钉 / 飞书的 webhook。想被"提醒"而不是"自己去看文件",用这个最省事。
- 脚本里自己调 webhook:在
run-daily-hot.ps1末尾加几行,把文件内容POST给 ServerChan(方糖)这类服务,就能推到微信。比如:
$content = Get-Content "E:\software-workspace\DeepSeek harness demo\dsh-daily-hot.txt" -Raw
Invoke-RestMethod -Uri "https://sctapi.ftqq.com/<你的SCKEY>.send" -Method Post -Body @{ title = "今日 AI 热点"; desp = $content }<你的SCKEY> 是 ServerChan 分配给你的密钥,去ServerChan 官网注册就有(这是个第三方服务,密钥别写进公开的仓库)。
让 dsh 自己搭:一条提示词搞定
前面几步是手动敲的:写脚本、建任务。其实这些 dsh 自己就能干——它既能写文件、跑命令,也能注册计划任务。把需求说清楚,它一次做完,你只管验收。
直接在 Web UI 的输入框发这条提示词:
帮我在 E:\software-workspace\DeepSeek harness demo 目录下完成两件事:
1. 创建一个 run-daily-hot.ps1 脚本:先用 Set-Location 切到该目录,再执行
dsh --profile headless "用 aihot 这个 skill 抓取过去 24 小时的中文 AI 热点资讯,整理成今日 AI 热点摘要(5 条左右),写入文件 dsh-daily-hot.txt";
2. 用 schtasks 注册计划任务 DSH Daily AI Hot,每天 09:00 用 powershell 运行这个脚本。
完成后手动触发一次,确认 dsh-daily-hot.txt 被更新,并告诉我结果。它会自己写脚本、自己跑 schtasks /Create、自己触发验证——你就在对话里看着它一步步做完。
说明一下:创建计划任务这类系统级操作需要完全权限,建议直接选这个权限继续,就不会弹确认。

执行完,它会自己汇报结果——脚本已就位、计划任务已创建并验证通过:

常见坑
| 坑 | 怎么避开 |
|---|---|
| 定时任务跑错目录 | headless 在定时器环境下的工作目录不由你控制,用脚本先 Set-Location 再跑 |
| 命令太长 / 引号嵌套出错 | 把命令包进 .ps1 脚本,定时器只调脚本 |
| 以为官方 Schedule 能"每天定点" | 它只做会话内提醒,没有日历规则;要定点跑任务用 headless + 定时器 |
| headless 报 TLS 握手错误 | schannel 通道问题,模型会换 OpenSSL 兜底,一般不影响结果 |
| 定时任务消耗 API 额度 | 别排太密,每天一次这种频率没压力 |
这一章你学到了什么
能自己完成下面几条,就算过关:
- [ ] 说清官方 Schedule(会话内提醒)和系统级自动化(headless + 定时器)的区别
- [ ] 会用
dsh web --patch apps/cli/config/examples/schedule/cordis.yml启用 Schedule,并说出它的边界(无外部通知、无日历规则) - [ ] 会用一条 headless 命令让 aihot 抓热点并写文件
- [ ] 会把命令包成
.ps1脚本,再用schtasks建定时任务、手动触发验证 - [ ] 知道"发送给我"的两种进阶:社区 webhook 插件 / 脚本里自己调 ServerChan
