---
title: "解决 erpc worker 的故障"
description: "最常遇到的 erpc worker 错误消息、各自的含义与应对方法，如何恢复可能已被接管的服务器，以及 erpc 从不做的事。"
canonical: "https://erpc.global/zh/doc/erpc-cli/worker-troubleshooting/"
locale: "zh"
---

# 解决 erpc worker 的故障

找到 `erpc worker` 打印的消息的开头，并按其所在行的说明操作。

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

## 错误消息及应对方法

worker 的故障使用 erpc 的错误码和退出状态：请参阅[错误与退出码](https://erpc.global/zh/doc/erpc-cli/commands/#错误与退出码)。

| 消息（开头部分） | 原因 | 应对方法 |
| --- | --- | --- |
| `<app> cannot start without <SETTING>` | `run.requires` 指定的设置没有被任何来源设置 | `erpc worker secret put <SETTING>`、在 `[vars]` 中设置，或使用设置它的线路进行部署（`--grpc`、`--unlimited`） |
| `your key was added but does not get in` | SSH agent 没有签名：1Password 处于锁定状态，或其请求未被允许 | 解锁 1Password，允许该请求，然后再次运行同一命令。它会接着执行 |
| `1Password could not …: authorization timeout` | 1Password 请求批准，但无人响应 | 在 1Password 中允许该请求，然后再次运行 |
| `<NAME> is empty; nothing was kept` | `secret put` 读取到空的标准输入：shell 不是终端 | 在终端中运行，或通过管道传入值 |
| `the keystore is locked, and nobody is at a terminal …` | 没有终端的命令需要密钥库，且没有保留解锁状态 | 在终端中运行 `erpc worker secret unlock`，然后再次运行该命令 |
| `nothing is kept under keystore:… on this machine` | 该值保存在另一台机器的密钥库中 | 在本机运行 `erpc worker secret put <NAME> --replace`；对于密钥，请带来那台机器的整个 `keystore` 目录及其密码短语 |
| `release <id> failed: …; the server went back to <previous>` | 新的 release 没有通过健康检查 | 查看 `erpc worker logs`。上一个 release 仍在运行 |
| `… is locked: the trading key has not been handed over` | 服务器重启了，agent 失败或被终止后由 systemd 再次启动，或执行了 `stop --lock` | `erpc worker start` |
| `port <n> is taken: …` | 另一个保持运行的 worker 使用了相同的健康检查端口，或另一个程序正在该端口上监听 | 在 `erpc.toml` 中为应用指定其专用的端口，然后再次部署 |
| `release <id> runs, and its WAF did not come up: …` | WAF 没有开始监听。最常见的原因是另一个程序占用了 `waf.port` | 运行 `erpc worker logs --waf`，然后释放该端口或更改 `waf.port`，并再次部署。在此期间应用仍在运行 |
| `waf.<key> …`（来自 `check`、`deploy`） | 某个 `[waf]` 键超出了其范围，或 `waf.port` 低于 1024，或与 `run.port`、SSH 或健康检查的端口相同 | 修正 `erpc.toml`。`erpc worker check` 会一次列出所有问题 |
| `the WAF's port <port> was not opened to …`（来自 `firewall allow`、`deny`、`sync`） | 该更改会在服务器尚未运行的 WAF 规则下让新的人进入 | `erpc worker deploy`：它会使新规则就位，然后开放端口 |
| `<kind> line <id> did not become active in <n> minutes` | 该线路仍在设置中 | 再次部署以继续等待 |
| `OUT_OF_STOCK` | 该区域中没有该方案的空闲服务器 | 使用 `--region <another>` 部署 |
| `the start may or may not have gone through: …` | 请求已发出但没有返回响应，或响应为 5xx、408 或 429 | 再次运行同一命令：它会发送同一请求 |
| `this purchase, or another of the account's, is still being made …` | 第一个请求仍在处理中，或账户的另一项购买持有其锁 | 稍后再次运行同一命令：它会发送同一请求 |
| `… changed in 1Password since this command read it` | 另一台机器在此期间写入了清单条目 | 再次运行该命令 |
| `the shared RPC takes none of the account's API keys from this machine (<n> tried)`（来自 `secret put --from-account`、`erpc rpc call`、`erpc webhook run`） | 账户的每个密钥在从本机使用时都被拒绝：密钥已过期，账户没有有效的共享 RPC 方案，或者密钥被限制为只能从其他地址使用，例如服务器的地址 | [ERPC Web Dashboard](https://dashboard.erpc.global/zh) 会显示密钥的过期时间和方案，并可创建新密钥。对于限制为服务器地址的密钥：`erpc worker secret put ERPC_API_KEY`，手动输入或通过管道传入 |
| `shared: … HTTP 401`（bench） | 共享 RPC 拒绝了该密钥：没有有效的共享 RPC 方案，或密钥错误 | 在仪表盘中检查方案，或设置 `ERPC_API_KEY` |
| `shared: … HTTP 429`（bench） | 方案的限速 | 使用 `--interval 150` 或更大的值 |

### erpc 无法记录的购买

当某台服务器或某条线路可能已由 erpc 无法记录的先前请求启动时，请在仪表盘中查看您账户的服务器和线路。使用 `erpc worker deploy --vps <ID>` 沿用服务器，或结束不需要的内容。然后手动从 `erpc.toml` 的 `[env.<name>.starting]` 中删除该条目：erpc 没有可以删除它的标志，在删除之前，同一命令会发送同一请求。

## 如果服务器可能已被接管

1. 首先运行 `erpc worker backup off`，撤销服务器的备份访问密钥。`off` 不会撤回服务器已经读取的内容。
2. 将资金从其交易密钥中转出，并更换其 Secret。
3. 从 [ERPC Web Dashboard](https://dashboard.erpc.global/zh) 重装服务器，然后再次部署。

如果重装更改了服务器的 SSH 主机密钥，erpc 会拒绝该服务器，直到您更新已固定的密钥。部署会带回代码，但不会带回应用的状态数据，后者只有备份才能恢复（[备份应用的状态数据](https://erpc.global/zh/doc/erpc-cli/worker-status-and-billing/#备份应用的状态数据)）。

## erpc 从不做的事

- 将密钥、Secret 或携带其中之一的 URL 放到命令行上。
- 将交易密钥或应用的 Secret 写入文件，只有一个例外：您机器上的密钥库，其中每一项都用您的密码短语加密。在服务器上，`erpc worker backup on` 会将服务器自己的备份密钥保存在仅限 root 访问的文件中。
- 在不显示价格的情况下启动任何东西。
- 让服务器处于开放状态：防火墙在应用首次启动之前就已生效。
- 连接主机密钥与已固定密钥不匹配的服务器。

[worker 指南](https://github.com/elsoul/erpc-cli/blob/v0.1.0-rc.4/docs/worker.md)列出了所有消息，包括 WAF 的消息。
