Skip to content

CH 15 · 定时任务与后台运行

全文字数3527 字预估耗时约 20 分钟前置CH 05、CH 08、CH 14难度可照做

本章目标

这一章解决一个问题:怎么让 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 文件,内容就三段(我直接按官方示例抄了一份):

yaml
# 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

然后启动时指向这个文件:

bash
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

bash
cd "E:\software-workspace\DeepSeek harness demo"   # 换成你的工作区
dsh --profile headless "用 aihot 这个 skill 抓取过去 24 小时的中文 AI 热点资讯,整理成一份简短的今日 AI 热点摘要(5 条左右,每条一句话加来源),写入文件 dsh-daily-hot.txt"

终端里输入这条 headless 命令

aihot 装在用户级货架(~/.agents/skills/aihot),headless 也能发现它,不用额外配置。执行完,一份 5 条的今日热点摘要就写进了 dsh-daily-hot.txt

headless 跑完后,终端里模型的完成汇报

跑的时候我这边环境有个小插曲:本机 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 换成你自己的:

powershell
Set-Location "E:\software-workspace\DeepSeek harness demo"   # 换成你的工作区
dsh --profile headless "用 aihot 这个 skill 抓取过去 24 小时的中文 AI 热点资讯,整理成今日 AI 热点摘要(5 条左右),写入文件 dsh-daily-hot.txt"

先手动跑一次这个脚本(把路径换成你自己的),确认它和直接敲命令效果一样:

powershell
powershell -ExecutionPolicy Bypass -File "E:\software-workspace\DeepSeek harness demo\run-daily-hot.ps1"

第 3 步:交给系统定时器

Windows 自带"任务计划程序",命令行用 schtasks 就能建。让它每天早上 9 点跑这个脚本:

powershell
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 步的脚本)

建完可以顺手验证一次,不等明天:

powershell
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(方糖)这类服务,就能推到微信。比如:
powershell
$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 的输入框发这条提示词:

text
帮我在 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、自己触发验证——你就在对话里看着它一步步做完。

说明一下:创建计划任务这类系统级操作需要完全权限,建议直接选这个权限继续,就不会弹确认。

Web UI 输入框里填好这条提示词,权限选了 Full access,模型为 DeepSeek-V4-Flash-Vision-Exp

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

dsh 汇报:run-daily-hot.ps1 已存在且内容正确,计划任务 DSH Daily AI Hot 已创建并验证(schtasks /Query:Status Ready),底部是整轮运行统计

常见坑

怎么避开
定时任务跑错目录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

Open Source · MIT · Community Driven