CH 15 · 定时任务とバックグラウンド実行
この章の目標
この章が解く問題は 1 つ:「Agent に時間になったら自分で動いてもらうには」。
dsh の「スケジューリング」には 2 つのレベルがあり、混同しやすいです:
| レベル | 内容 | 典型シナリオ |
|---|---|---|
| セッション内リマインダ(公式 Schedule) | 同じセッション内で「X 分後に教えて」とモデルに頼む | 「20 分後に結果を確かめに戻るように教えて」 |
| システムレベル自動化(headless + スケジューラ) | Agent 全体がタスクを走らせて終了、OS スケジューラが時間になったら起こす | 「毎朝 9 時に AI 热点ニュースを送って」 |
本章前半は公式 Schedule をはっきりさせます(任意のオーバーレイ機能、本記事は直接使えるユーザーガイド);後半は本章のメイン実操作 —— CH 14 でインストールした aihot Skill を使い、「定时で AI 热点を取得する」タスクを組みます。
公式 Schedule:セッション内の定时リマインダ
とは何か
公式パッケージ @deepseek-ai/dsh-schedule はセッション内リマインダを提供します:同じセッション内で「後で教えて」とモデルに頼めます。到達時、このセッションに通常の追従メッセージとして戻ります。
これは**任意の能力(オーバーレイ)**で、デフォルトは無効。有効化するには dsh web 起動時に patch を加えます。公式のサンプルは公式リポジトリの apps/cli/config/examples/schedule/cordis.yml にあります —— この相対パスコマンドは clone した公式リポジトリのルートディレクトリで走らせたときのみ有効で、npm install しただけの dsh では使えません。リポジトリを clone しない場合は、同等の patch ファイルを自分で作ることもできます;内容は 3 セクション(公式サンプルから直接コピー):
# 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:\your-path\schedule.overlay.ymlこれは 3 つのことを行います:dsh-time-context を追加(モデルがブラウザのタイムゾーンで時間を理解できるようにする)、dsh-schedule を追加(リマインダツールを提供)、ui-schedule を有効化(保留中のリマインダを UI に表示)。
使い方
有効化後、新しいセッションを開始すると、モデルに 3 ツールが入ります:
| ツール | 機能 |
|---|---|
schedule_create | リマインダを作成 |
schedule_list | 保留中の全リマインダを一覧 |
schedule_delete | id でキャンセル |
リマインダ作成のルールは 3 種:
| ルール | 説明 |
|---|---|
after | 何秒後に 1 回リマインド(ワンショット) |
at | 特定の時刻に 1 回リマインド(ワンショット) |
every | 固定間隔で繰り返し、最低 5 分 |
使い方は自然言語 1 文、たとえば「20 分後にデプロイ結果を確かめるよう教えて」と、モデルが schedule_create を呼び、リマインダの id、ターゲット時刻、状態を返します。
境界
| できること | できないこと |
|---|---|
| セッション内追従メッセージのリマインダ | メール / SMS / プッシュ / ブラウザ通知なし |
| リマインダは再起動後も生き残る(セッションログに保存) | 「毎週平日 9 時」のようなカレンダー / Cron ルールなし |
| 固定間隔繰り返し(≥5 分) | セッションが閉じていると遅延のまま、復帰後に最新 1 件のみ backfill |
1 行まとめ:公式 Schedule は「セッション内の時間になったら知らせる」を担当し、「バックグラウンドでタスクを自動走らせ」は担当しない。後者 —— 後半でやる定时热点 —— には headless + システムスケジューラが必要。
メイン実操作:aihot に毎朝 AI 热点を送らせる
方針
CH 14 で aihot(AI 热点を取得する検索 Skill)をインストールし、CH 05 で headless(ワンコマンドでタスクを走らせて終了)を学びました。両者を組み合わせ、「時間になったら起こす」スケジューラを足せば、完整的定时热点タスクになります:
headless が aihot を使って热点を取得 → ファイルに書く → システムスケジューラが毎朝 9 時にこのコマンドを再実行
ステップ 1:まず手動で 1 回走らせ、動くことを確認
すぐスケジューラに行かず、まず手動で動かします。出力ファイルを置きたい作業ディレクトリでターミナルを開きます;私のは E:\software-workspace\DeepSeek harness demo:
cd "E:\software-workspace\DeepSeek harness demo" # 自分の作業ディレクトリに置き換え
dsh --profile headless "aihot Skill を使って過去 24 時間の中文 AI 热点ニュースを取得し、今日の AI 热点サマリ(約 5 件、各 1 文 + ソース)にまとめて、ファイル 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 がその日の最新の热点、作業ディレクトリを開けば見られます。これがゼロコストのコアループです。
スマホにプッシュしたい場合は、もう 2 つ道があります:
- コミュニティのスケジューラプラグイン dsh-scheduler をインストール:cron トリガをサポートし、結果を ServerChan / 钉钉 / 飞书 webhook に届けます。「通知されたい」、つまり「自分でファイルを見に行きたくない」なら、これが最も手軽。
- スクリプト内で自分で webhook を呼ぶ:
run-daily-hot.ps1の末尾に数行足し、ファイル内容を ServerChan(方糖)などのサービスにPOSTし、微信にプッシュ。たとえば:
$content = Get-Content "E:\software-workspace\DeepSeek harness demo\dsh-daily-hot.txt" -Raw
Invoke-RestMethod -Uri "https://sctapi.ftqq.com/<your-SCKEY>.send" -Method Post -Body @{ title = "今日の AI 热点"; desp = $content }<your-SCKEY> は ServerChan があなたに割り当てるキー;ServerChan サイト で登録して取得(これは第三者サービス、キーは公開リポジトリに書かないこと)。
dsh にやらせる:1 つのプロンプトで完結
ここまでのステップは手動:スクリプトを書き、タスクを作る。実は dsh はこれ全部を自分でできます —— ファイルを書け、コマンドを走らせ、予定タスクを登録できます。要件を明確にしておけば、全部 1 回でやってくれます;あなたは検証するだけ。
Web UI の入力欄にそのままこのプロンプトを送ります:
E:\software-workspace\DeepSeek harness demo ディレクトリで 2 つのことをやっってください:
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 でこのスクリプトを実行。
完了後、手動で 1 回トリガーし、dsh-daily-hot.txt が更新されたことを確認し、結果を教えてください。自分でスクリプトを書き、自分で schtasks /Create を実行し、自分でトリガー検証まで —— 会話を眺めているだけで OK。
注意:予定タスク作成などシステムレベル操作には full access 権限が必要;確認ダイアログを出さないためにも、この権限を選んで続行してください。

実行後、自分で結果を報告します —— スクリプトは揃い、予定タスクも作成・検証済み:

よくある落とし穴
| 落とし穴 | 避け方 |
|---|---|
| 予定タスクが作業ディレクトリを間違える | スケジューラ環境下の headless の作業ディレクトリは自分で制御できない、スクリプトで先に Set-Location してから走らせる |
| コマンドが長すぎ / クォートネスト誤り | コマンドを .ps1 スクリプトに包む、スケジューラはスクリプトだけを呼ぶ |
| 公式 Schedule で「毎日定时に走らせられる」と思った | あれはセッション内リマインダだけ、カレンダールールなし;定时にタスクを走らせるには headless + スケジューラ |
| headless が TLS ハンドシェイクエラーを報告 | schannel チャンネルの問題、モデルが OpenSSL にフォールバック、一般には結果に影響しない |
| 予定タスクが API クォータを消費 | 詰め込みすぎない、1 日 1 回の頻度なら余裕 |
この章で学んだこと
下の項目を自力で達成できれば合格です:
- [ ] 公式 Schedule(セッション内リマインダ)とシステムレベル自動化(headless + スケジューラ)の違いを明確に言える
- [ ]
dsh web --patch apps/cli/config/examples/schedule/cordis.ymlで Schedule を有効化する方法を知り、その境界を言える(外部通知なし、カレンダールールなし) - [ ] headless コマンドで aihot に热点を取得させファイルに書ける
- [ ] コマンドを
.ps1スクリプトに包む方法を知り、schtasksで予定タスクを作成し手動トリガで検証できる - [ ] 「自分に届ける」の 2 つの進んだ方法を知っている:コミュニティ webhook プラグイン / スクリプト内で自分で ServerChan を呼ぶ
