---
title: "使用 erpc worker 运行、监控应用并为其付费"
description: "查看应用是否在运行以及按小时计算的费用，回滚 release，从服务器测量 RPC 延迟，备份其状态数据，并结束其按小时计费。"
canonical: "https://erpc.global/zh/doc/erpc-cli/worker-status-and-billing/"
locale: "zh"
---

# 使用 erpc worker 运行、监控应用并为其付费

`erpc worker status` 显示您的应用是否在运行，以及其按小时计算的费用。每次启动都会先显示其价格，`erpc worker delete --release-server` 会结束应用按小时使用的 gRPC、Shreds 和 Unlimited RPC，然后结束其按小时计费的服务器。

本页介绍 ERPC CLI `v0.1.0-rc.4`，这是一个预发布版本。

## 检查应用

```text
$ erpc worker status --env prod
api-prod on 203.0.113.10: running, release 20261101T093000Z-1a2b3c4d, pid 4217, up 2h 14m
  current 20261101T093000Z-1a2b3c4d, previous 20261028T171500Z-9f8e7d6c, 2 releases kept
  WAF: listening on port 8080, forwarding to 127.0.0.1:3000, since 2026-11-01T09:30:12Z; requests 5120, forwarded 5043, blocked 71, connections refused 12, app errors 6, addresses banned now 1
  `erpc worker delete --release-server --env prod` ends what this app is charged for.
```

`status` 显示应用处于锁定状态还是正在运行、哪个 release，以及从何时开始。登录后，它还会显示该环境按小时计算的费用，每个项目附带您的账户为其支付的价格，以及您账户的 Credit 及其可维持的时长。`--json` 在 `hourly.charged` 下包含相同内容。

不在账户计费项目中的项目会被说明为不在其中，而不会被称为已结束，因为该列表可能比启动晚一分钟。没有会话时，或无法读取您账户的计费项目时，`status` 会说明已记录的内容。

## 控制应用

| 命令 | 作用 |
| --- | --- |
| `erpc worker logs -n 200`, `logs -f` | 应用和 agent 的日志。行中的控制字符会打印为 `?` |
| `erpc worker start` | 运行应用，worker 处于锁定状态时会发送密钥 |
| `erpc worker stop`, `stop --lock` | 停止应用；`--lock` 还会将密钥从内存中清除 |
| `erpc worker restart` | 停止应用后再次启动 |
| `erpc worker releases` | 服务器上保留的 release（`deploy.keep_releases`） |
| `erpc worker rollback`, `rollback --to <release>` | 回到上一个 release，或指定的 release。当该 release 的健康检查端口现已被另一个正在运行的 worker 占用时，会被拒绝，正在使用的 release 保持不变 |
| `erpc worker api <PATH>` | 从本机读取应用的 API，而 API 仍在服务器的 loopback 上（更改时使用 `-X POST`、`-d '{...}'`） |
| `erpc worker trades [--profit]` | 应用在其服务器上的交易 |
| `erpc worker list` | 本机上的应用及各自的部署位置；`--prune` 会移除其 `erpc.toml` 已不存在的应用 |

应用的 `API_TOKEN` 在此读取，通过标准输入到达服务器，不出现在任何命令行上，也不出现在任何日志中。每个 worker 命令都接受 `--env <name>`（默认为 `default`）和 `--json`，但 `secret unlock` 和 `secret lock` 除外：它们针对的是本机的密钥库而不是某个应用，不接受 `--env`。从任何位置运行时，命令会按 erpc 所知的名称找到其应用；`secret put`、`secret rm`、`key import`、`firewall allow` 和 `firewall deny` 只通过 `--dir` 指定应用。

## 按小时计费如何运作

- **每次启动都会先显示其价格**。在终端中，只有在得到确认后才会启动；使用 `--yes` 时，写明要启动什么的命令行本身就是确认。
- **按小时计费的产品从 ERPC Credit 中支付**，ERPC Credit 需要预先购买，Credit 不足以支付的启动会被拒绝。价格请见[价格](https://erpc.global/zh/price/)和 [ERPC Web Dashboard](https://dashboard.erpc.global/zh)。
- **新的 VPS 一旦被命名就会被记录**，此时它尚未就绪。下一次部署会沿用它，而不是再购买一台。
- **对于 `deploy`，没有得到响应的启动会被再次发送，绝不会作为新的启动发送**。其请求键保留在记录中（`[env.<name>.starting]`），因此再次运行同一命令会发送同一请求。在某些响应之后，它会一直保留，直到您手动将其删除（[erpc 无法记录的购买](https://erpc.global/zh/doc/erpc-cli/worker-troubleshooting/#erpc-无法记录的购买)）。`erpc worker run` 不保留记录，因此其下一次运行会发出新的请求。
- **一次只部署一个环境**。同时启动的同一环境的两次部署可能会购买两份，这不受支持。
- **一条线路是否仍然存在，取决于账户正在为哪些项目付费**。erpc 从不结束不按小时计费的线路：请在仪表盘中结束它。

## 移除应用

`erpc worker delete` 移除 worker。`erpc worker delete --release-server` 还会结束其线路，然后结束其按小时计费的服务器。无法结束的内容会保留在记录中，不按小时计费的线路会被列出名称，以便在仪表盘中结束。

- 普通删除会拒绝已购买但从未连接上的 VPS，因为删除会在其仍在计费时遗忘它。对已连接上的按小时计费的 VPS 进行普通删除，会在其仍在计费时将其从记录中移除，并对此发出警告。
- 使用 `--forget` 时，erpc 不会尝试连接已无法连接的服务器，`--forget-line <id>` 将在 erpc 之外结束的线路从记录中移除。

## 从服务器测量 RPC 延迟

`erpc worker bench` 从环境的服务器为 RPC 调用计时：ERPC 的共享 RPC、其 Unlimited RPC，以及其他任意 RPC，并排比较。服务器上的 agent 为每次调用计时，因此这些数字就是应用实际得到的。

```bash
erpc worker bench                                  # getSlot: shared RPC vs the Unlimited RPC
erpc worker bench --rounds 300 --interval 150      # for a plan that limits calls per second
erpc worker bench --url other=op://<vault-id>/<item-id>/url   # another provider's RPC
```

- `--method` 接受 `getSlot`、`getBlockHeight`、`getLatestBlockhash` 或 `getHealth`。
- `--no-shared` 不包括共享 RPC。`--url` 的值可以是 URL 本身、`op://…`、`keychain:…` 或 `keystore:…` 引用（指向保存着带有密钥的 URL 的位置；绝不能是交易密钥的条目，这样的引用会被拒绝），或 `-`（从标准输入读取，或提示您不显示地输入）。超过六个端点会被拒绝。
- bench 会打印 p50、p90、p99、最小值和最大值、失败情况及第一个失败原因，以及在同一轮中每个响应落后于最新响应多少个 slot。
- 密钥只通过标准输入到达服务器，表中显示 scheme、主机和端口。

## 备份应用的状态数据

`erpc worker backup on` 每天将应用的状态数据备份到 ERPC Global Storage，由 restic 加密，时间为服务器时间的 `--at`，并在其后 30 分钟内进行。需要一个存储方案（`erpc storage buy 5`）。

- **备份的内容**是应用的状态数据，即 `/var/lib/private/erpc-worker-<id>`。release 不会被备份，因为部署会将它们放回。Redis 和 PostgreSQL 的数据不在备份范围内。
- **服务器无法删除快照**。它从不持有 erpc 会话、账户的管理密钥或其主密码。
- **被接管的服务器可以**读取账户中每台机器的快照，包括本机的快照；在 `off` 之后仍保留仓库的密钥，而 restic 从不更改该密钥；以另一台机器的名义添加快照，因此发生这种情况后，请检查 `restore latest` 选中的是什么；以及填满账户的存储，从而使每台机器的备份都停止。`erpc worker backup off` 会首先撤销服务器的访问密钥，无论服务器是否响应。
- **restic 按文件当前的样子复制**，而此时 worker 仍在运行，因此数据库可能需要单独的转储才能恢复到一致的状态。服务器关机期间错过的运行会在服务器恢复后运行。
- `erpc worker backup off`、`status` 和 `now` 分别停止备份、报告备份情况和运行备份。快照在 `off` 之后仍然保留，`erpc backup prune --host` 会精简旧的快照。

在本机上运行 `erpc backup init` 之后，从本机恢复：

```bash
erpc backup restore latest --from-host erpc-worker-<id>-<tag> --path /var/lib/private/erpc-worker-<id> --target ./restored
```

## 多个环境和多台机器

- 一台服务器上的多个 worker 各自作为自己的单元运行，共用服务器的防火墙表，并且各自只开放自己的端口。
- 一个应用可以有多个环境（`[env.staging]`、`[env.prod]`），每个环境有自己的服务器和线路。
- 环境可以将其服务器信息保存在 1Password 中，而不是 `erpc.toml` 中。这样，任何登录到该保险库并拥有应用仓库的机器都可以运行所有命令；此类应用中的 `keychain:` 和 `keystore:` 引用会收到警告，因为其他机器无法读取它们。新环境会将其信息保存在 1Password 中，前提是 `erpc login` 也将会话保存在那里；`deploy --vault <vault-id>` 指定另一个保险库，`deploy --inline` 将信息保存在 `erpc.toml` 中。
