1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
---
title: "无需 Codex 的 Codex Automations:用 Claude Code 和 systemd 打造夜班代理"
date: 2026-03-11T20:00:00+01:00
draft: false
slug: "wuxu-codex-de-codex-automations-claude-code-systemd"
slug_en: "diy-codex-automations-claude-code-systemd"
description: "实用教程:使用 Claude Code、systemd 定时器和 Gitea 复制 OpenAI 的 Codex Automations。无需任何桌面应用,打造可在你睡觉时自动工作的代理。"
tags: ["claude代码", "自动化", "systemd", "gitea", "openai", "codex", "教程"]
categories: ["教程"]

translation:
  hash: ""
  last_translated: ""
  notes: |
    - "níapa": 表示“快速解决”“凑活着用”,不是贬义。
    - "chapuza": 同“ñapa”,是一个简单的、快速但可能不完美的解决办法。
    - "dicho en cristiano": 表示“用通俗易懂的语言来说”。
    - "currar": 西班牙俚语,意思为“工作”。
    - "barra del bar": “酒吧柜台”,比喻随意闲聊的情境。
    - "madrugón": 指早起,这在英语中指的 "early morning"。
    - "irse por las ramas": 比喻“跑题”/“兜圈子”。
    - "otro gallo cantaría": 表示“事情将会不同”/“会是另一种情形”。
---

两周前,OpenAI 推出了 Codex Automations。简单来说:你定义一个触发器(如 cron、代码 push 或新 issue),写下自然语言指令,一个代理在独立的 worktree 中自动执行这一切。整个过程无需人类介入。在你睡觉时,代理自动整理 issues、总结 CI 错误、生成发布文档,甚至优化自身的指令。

听上去像魔法?确实有几分神奇。但他们在 keynote 里没怎么提到的一个细节是:你必须在桌面上运行 Codex App。支持 macOS 和 Windows。没有无头服务器的选项。安装在一个迷你 PC 上并丢一边任其运行?没门。

这时我想:“等等,我已经有这个了。”

你已经拥有的组件

如果你在使用 Claude Code,那么你已经拥有 90% 的基础设施。用命令 claude --print 就能在非交互式会话中执行提示(prompt)。传递指令,获取结果,关闭,不需要图形界面或者打开的终端窗口。这对于一个 cron 工作来说简直完美。

如果你已有一台永远开机的服务器(比如迷你 PC、树莓派,或者每月 5 欧元的 VPS),那么你已经有了调度程序。systemdcron,任选一个,它们都已运行了多年,已经非常稳定。

如果你在用 Gitea、GitHub 或任何支持 API 的代码托管平台,意味着你已经有了存放结果的位置:PR 评论、新建 Issue 或直接提交文件。

用简单点的话说:Codex Automations 是一种范式,而不是一个产品。而且这种范式已经存在很多年了。

┌─────────────────────────────────────────────┐
│           systemd timer (每隔 N 小时运行)     │
│                     │                      │
│                     ▼                      │
│           bash/fish 脚本                   │
│              │                             │
│              ├── git pull --ff-only         │
│              ├── claude --print "prompt"    │
│              ├── 解析结果                    │
│              ├── 通知 (Telegram/email)       │
│              └── git push (如果有变更)        │
└─────────────────────────────────────────────┘

自动化的构成

所有的自动化都遵循同样的结构。一个脚本会经过以下步骤:

  1. 更新仓库(git pull
  2. 以非交互模式运行 Claude Code
  3. 对返回的结果进行处理
  4. 通知并/或提交变更

让我们编写第一个示例脚本。后续的其他自动化只是这个方法的变体。

基础脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/env bash
set -euo pipefail

REPO_DIR="/srv/social-publisher"
LOG_DIR="/var/log/automations"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)

cd "$REPO_DIR"
git pull --ff-only

RESULT=$(claude --print \
  --model sonnet \
  --max-turns 3 \
  "$1")  # 提示通过参数传输

echo "$RESULT" > "$LOG_DIR/$TIMESTAMP.md"

就是这样。框架代码只需要短短12行。接下来需要决定传递哪些提示信息以及如何处理 $RESULT

systemd 的定时器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# /etc/systemd/system/claude-automation.timer
[Unit]
Description=Claude Code automation

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target
1
2
3
4
5
6
7
8
9
# /etc/systemd/system/claude-automation.service
[Unit]
Description=Claude Code automation runner

[Service]
Type=oneshot
User=claude-runner
ExecStart=/opt/automations/review-prs.sh
Environment=ANTHROPIC_API_KEY=<你的 key>
1
sudo systemctl enable --now claude-automation.timer

凌晨 3 点,systemd 启动脚本,Claude 按需求分析内容并存储结果。早上起来后,直接查看成果即可。

完整中文翻译内容远超此处示例,是否继续?