所有頁面
本頁內容

疑難排解

遇到問題時,從這裡開始。前幾節是幾乎適用於所有情況的檢查。之後的表格會從你看到的現象,帶你找到有解法的頁面。那些頁面大多以各自的疑難排解章節結尾;本頁不會重複它們的內容。

第一步 #

在中繼所在的機器上,於終端機中執行:

oar status
oar doctor
  1. oar status 會說明中繼是否有回應。請對照下方的表格閱讀它的前幾行。
  2. oar doctor 會印出它找到的安裝、設定檔和供應商 CLI。它不會變更任何東西,而且一律以 0 結束,所以請逐行閱讀它的輸出。
  3. 查看瀏覽器。 狀態點和橫幅會告訴你,問題出在瀏覽器與中繼之間,還是在中繼後面。
  4. 閱讀與問題相關的記錄(記錄)。
  5. 重新啟動可能有幫助的最小範圍(重新啟動)。

這兩個指令在 oar 指令中說明。

解讀 oar status #

輸出行 指向的問題
Not set up yet — run: oar setup 這個安裝中沒有設定檔。請執行 oar setup。首次執行
The relay is running on port <port> (<access>): <url> 中繼正常。開啟該 URL;oar url 會印出含 token 的 URL。這時問題出在瀏覽器、登入或某個 session
The relay is stopped (port <port>, <access>). Start it with: oar start 連接埠上沒有任何東西回應。請執行 oar start,如果失敗,請閱讀安裝與啟動
Port <port> is held by another program, or by a relay with another token. 其他程式正在使用這個連接埠,或使用先前 token 的舊中繼仍在執行。見無法啟動時
The relay runs with its earlier settings; restart it to apply the new ones. 你用 oar setup 變更了連接埠、token 或存取範圍。請執行 oar restart
Service: <state> 登入時啟動的服務。見自動啟動中繼
Tunnel: <state> 內建的 Cloudflare tunnel。見 Cloudflare tunnel

結束代碼 3 表示中繼沒有在執行、連接埠被其他東西占用,或沒有設定檔。結束代碼 0 表示中繼正在執行。

解讀 oar doctor #

輸出行 告訴你什麼
OAR <version> 和 node OAR 的版本,以及執行 oar 的 Node.js。回報問題時請附上兩者
mode git checkout(git 檢出):oar update 和 oar service 在那裡會拒絕執行。global install(全域安裝)是一般情況
state root 和 config 指令查看的是哪個安裝。同一台機器上的兩個安裝各有一組。設定檔路徑後面出現 (missing — run: oar setup),表示沒有設定檔;此時會省略 port、auth token 和 tunnel
port 連接埠,以及誰能連到它。localhostOnly: yes 表示只有這台機器;其他裝置需要 oar setup --lan 或 tunnel
auth token MISSING 表示沒有設定 token。請執行 oar setup
tunnel disabled、managed (cloudflared: <path>) 或 managed, cannot start: <reason>。原因會指出哪裡出錯,例如缺少 cloudflared
database 這個安裝使用的資料庫及其大小。(not created yet) 表示中繼從未從這個安裝執行過。如果你的對話不見了,或訊息一直處於待處理狀態,請確認這是你預期的資料庫(每個資料目錄一個中繼)
provider CLIs gh (Copilot)、claude 和 grok 會顯示版本,或顯示 not found。doctor 以你終端機的 PATH 尋找;服務使用的則是它安裝當時的 PATH(自動啟動中繼)。cursor 一律顯示 bundled (@cursor/sdk),不論是否已儲存金鑰
warning 在 WSL 中,Windows 占用了中繼的連接埠。請用 oar setup --port <port> 選擇另一個

doctor 印出的是狀態資料夾,而不是記錄資料夾,它也不會說明中繼是否在執行:那是 oar status 的工作。記錄在哪裡,請見檔案與資料夾。

記錄 #

問題 閱讀
中繼無法啟動,或會自行停止 記錄資料夾中的 server-err.log,但只限於 oar start 自己在背景啟動中繼的情況。在 Linux 服務下,啟動錯誤在 journal 中(journalctl --user -u oar),而不在 server-err.log 中;見狀態與記錄
中繼做過的任何事:預覽、tunnel、更新、重新啟動 relay-console.log。它會把你的存取 token 顯示為 [token]
某個對話沒有回應,或它的 agent 停止 worker-<session>.log,即該對話的 worker。Copilot 擴充功能引擎沒有這個記錄;請見 ext-debug.log 和 Copilot 終端機
服務無法啟動 systemctl --user status oar,然後 journalctl --user -u oar

所有記錄檔、它們的輪替方式,以及 git checkout 中的記錄資料夾,都在檔案與資料夾中說明。

在瀏覽器中 #

  • 狀態點位於對話清單頂端:灰色是 Web relay unreachable(無法連到網頁中繼),表示瀏覽器連不到中繼;綠色是 Web relay reachable(可連到網頁中繼);琥珀色表示透過已連線的 Cloudflare tunnel 連到中繼。工具提示會說明更多,例如有多少個 worker 正在忙碌。狀態點
  • 橫幅 CLI is offline — messages will queue until it reconnects(CLI 離線 — 訊息會排入佇列,直到它重新連線)以及側邊欄中的 CLI offline(CLI 離線),表示 10 秒內沒有任何 session worker 回報。在閒置的中繼上,這是正常的:傳送一則訊息,橫幅就會消失。如果它一直存在,請閱讀 worker 記錄。無法連到 agent 時

重新啟動 #

對象 時機 方法
某個對話的 agent 對話卡住、Stop(停止)沒有作用,或 agent 應該載入新的設定 ⋯ 選單中的 ☠️ Kill session(強制結束 session)。歷史記錄和佇列會保留;下一則訊息會啟動新的 worker。Kill session
中繼 新版本、變更過的設定檔、新安裝的供應商 CLI 在中繼的機器上執行 oar restart,或使用 ⋯ 選單中的 🌄 Restart web relay(重新啟動網頁中繼)。兩者都會等待執行中的回合,但 Linux 服務例外,在那裡 oar restart 會結束它們。重新啟動中繼

症狀 #

安裝與啟動 #

你看到的現象 常見原因 解決方式
npm install -g @oar-sh/oar 因 EACCES 而失敗 npm 的全域資料夾需要 root 權限 使用安裝程式,不要用 sudo。安裝
Node.js 太舊或找不到;oar: command not found;oar 在 PowerShell 中被封鎖 Node.js 低於 22.13,或 PATH 沒有重新載入 安裝
安裝因 node-gyp 或 prebuild 錯誤而失敗 沒有適用於你平台的預先建置 better-sqlite3 安裝
用 npm 12 安裝後中繼無法啟動,並出現 better-sqlite3 錯誤 npm 12 略過了安裝腳本 用 --allow-scripts=@oar-sh/oar,better-sqlite3,koffi 重新安裝,絕不要用 --ignore-scripts。安裝。如果是 oar start 啟動了中繼,錯誤在 server-err.log 中,否則在 journal 中
Port 3333 is in use by another program ... 其他程式或舊的中繼占用了連接埠 無法啟動時
The relay did not come up — see …/server-err.log 中繼啟動後又結束了 無法啟動時
Relay already running(中繼已在執行)或 Relay appears to be owned by another live process(中繼似乎屬於另一個執行中的程序),結束代碼 78 同一個資料目錄上有第二個中繼 依照該行結尾的提示操作(oar stop, or end process <pid>)。每個資料目錄一個中繼
[data] Not starting: each database has changes newer than the other's 0.9.14 新增 中繼找到它先前執行時使用的資料庫,而兩者都存有工作內容 保留其中一個,把另一個的 copilot.db、-wal 和 -shm 移到你自己的資料夾中,然後執行 oar start。0.9.14 的升級說明
[oar] The relay … is bringing over the database it ran on until now … 0.9.14 新增 更新後第一次啟動時會複製大型資料庫 請等待;完成後它就會回應。不要啟動第二個中繼。0.9.14 的升級說明
更新後,Windows 自動啟動或 gh copilot 中繼的對話不見了 0.9.14 之前,那種中繼把資料放在套件內 0.9.14 的升級說明
[startup] Cannot create … 或 … is a file, not a folder,結束代碼 78 0.9.14 新增 無法建立資料資料夾或上傳資料夾,例如它所在的磁碟機不存在 讓該磁碟機或資料夾可供使用。等待 TEMP 和資料磁碟機
No systemd user session here、Could not enable lingering,重新開機後中繼不見了 沒有 systemd 使用者 session,或 lingering 已關閉 自動啟動中繼
WSL:Windows 瀏覽器顯示另一個頁面,或拒絕 token Windows 占用了該連接埠 oar setup --port <port>。無法啟動時
在服務下,session 中找不到某個工具或 node 服務會沿用安裝時的 PATH 自動啟動中繼
Nothing changed: OAR does not delete or overwrite an autostart entry it did not make.(Windows) 0.9.15 新增 手動建立或編輯過的「啟動」資料夾項目、開機任務或啟動器擋住了切換 自己移除它,或用 --replace 執行切換,這會保留一份副本。非 OAR 建立的項目
Nothing changed: the boot task could not be read (…)(Windows) 0.9.15 新增 任務存在,但 OAR 無法讀取它,通常是 Access is denied(拒絕存取),因為它儲存了另一個帳戶的密碼 以系統管理員身分在工作排程器中查看它。非 OAR 建立的項目
oar uninstall 停在 Not done: … 0.9.15 新增 某個步驟失敗了:中繼沒有停止、系統管理員提示被拒絕、某個資料夾無法刪除 先處理它前面那一行所說的問題,然後再執行一次相同的指令。oar uninstall
已移除的套件旁邊留下一個隱藏的 .oar-* 資料夾 0.9.15 新增 npm 移除套件時,仍有 session worker 從該套件執行 等那些程式結束後再刪除該資料夾,最晚在重新開機後。oar uninstall

登入與連到中繼 #

你看到的現象 常見原因 解決方式
登入框中出現 Invalid token(token 無效) 舊的或錯誤的 token 使用 oar url 提供的 token。無法啟動時
Too many failed sign-in attempts. Try again in … seconds.(登入失敗次數過多。請在 … 秒後重試。) 一分鐘內從這個位址輸入了十次錯誤的 token 等這一分鐘過去,再使用正確的 token。如果在另一台機器上的 proxy 後面,請設定 trustProxy,否則所有訪客會共用同一個鎖定。登入的防護
腳本存取帶有 ?token= 的 API 或檔案位址時得到 401 從 0.9.11 起,?token= 只會讓頁面登入 傳送 Authorization: Bearer <token>。出示 token 的方式
每個裝置都再次要求輸入 token oar setup --new-token 會讓所有裝置登出 如果你遺失了 token
狀態點是灰色:Web relay unreachable 中繼已停止,或位址錯誤 在中繼的機器上執行 oar status。狀態點
手機無法開啟該位址 存取範圍是 this machine only(僅限本機) oar setup --lan,或使用 tunnel。從手機連線
tunnel 已關閉(cloudflared is not installed)或不斷重新連線 缺少 cloudflared、token 錯誤,或 SSH 登入失敗 Cloudflare tunnel、SSH tunnel
訊息一直留在佇列中,而且佇列已暫停 tunnel 設為 required,但沒有連線 同上兩個章節
在 Caddy 或 nginx 後面,頁面不斷重新連線、在前綴路徑下一片空白,或一再要求輸入 token proxy 封鎖了 WebSocket、移除了前綴,或需要更多設定 反向 proxy
在 proxy 後面,頁面能載入,但沒有任何即時更新,而中繼記錄顯示 Refused a handshake from origin proxy 改寫了 Host 標頭 在 allowedOrigins 中列出公開的 origin。allowedOrigins

對話無法開始或 agent 沒有回應 #

每個供應商頁面的結尾都列出該供應商可能發生的失敗。失敗的回覆通常會指出原因,而且常附有一個可以修正問題的按鈕。

供應商 典型的失敗 解決方式
GitHub Copilot 儲存 SDK 遭拒並顯示 COPILOT_SDK_PATH did not resolve(COPILOT_SDK_PATH 無法解析)、runtime 無法驗證、沒有剩餘的 AI 點數、oar copilot 說缺少 GitHub CLI GitHub Copilot、儲存 SDK 遭拒時
OpenAI OpenAI API key is not configured、模型探索失敗、OpenAI image API failed (401) OpenAI
Claude New Chat(新對話)中沒有它、Not logged in、指向計費問題的回覆、0.9.18 新增 relay.subscription-key-source Claude
Claude API 0.9.18 新增 金鑰不在 workspace 中(HTTP 400)、已達到每月上限,即出現 relay.claude-api-cap-reached 或 New Chat 提供 Start on subscription(以訂閱開始)、金鑰不被接受(relay.claude-api-key)、帳戶的點數或花費上限(relay.claude-api-credit、relay.claude-api-spend-limit)、卡片對某個模型顯示 no price known Claude API、錯誤碼
Claude Cloud 登入已過期、GitHub 未連接、沒有雲端環境 Claude Cloud
Cursor Cursor API key is not configured、Cursor model "…" is not available Cursor
Grok Grok CLI was not found on PATH、Grok authentication failed Grok
DeepSeek 0.9.17 新增 餘額用完(relay.deepseek-balance)、金鑰不被接受(relay.deepseek-api-key)、同時發出太多請求(relay.deepseek-rate-limit);其他失敗會顯示為 relay.deepseek-…,例如 relay.deepseek-api-error DeepSeek、錯誤碼
你看到的現象 常見原因 解決方式
New Chat 中缺少某個供應商 它已關閉,或沒有金鑰或登入 上方該供應商的頁面;已關閉的供應商
第一個畫面上出現 Set up a provider(設定供應商) 沒有任何供應商已就緒 第一眼看到的畫面
模型清單過舊或有誤 需要重新執行模型探索 🤗 Select Models → Refresh(選擇模型 → 重新整理);各供應商的方式見上方它的頁面
回覆下方沒有用量行 只有 Copilot 回合會記錄方案用量 GitHub Copilot
Check Usage(檢查用量)卡片顯示 Error(錯誤)、Unavailable(無法使用)或只有估算值 即時讀取失敗;卡片會退回使用它已有的資料 重新整理,以及數字有多新

回合卡住、失敗或重新啟動 #

你看到的現象 常見原因 解決方式
橫幅 CLI is offline 沒有 worker 回報 無法連到 agent 時
長回合回到佇列並重新開始 Max turn duration(回合最長時間)已到(預設 60 分鐘),或閒置時間窗(10 分鐘)已用完 在 Settings → General(設定 → 一般)中調高或清除 Max turn duration。回合卡住時
System note: the … runtime sent nothing for Ns ... Copilot SDK 引擎、Cursor 或 Grok 的靜默監看結束了回合 再傳送一次訊息。回合失敗時
Relay timeout after 5 attempts 或 Relay recovery limit reached 回合一再重新排入佇列,直到嘗試次數用完 回合失敗時
對話似乎卡死了;Stop 沒有任何作用 worker 停止回應 ☠️ Kill session,然後再傳送一次訊息。Kill session
訊息一直處於待處理狀態 重新啟動已排入佇列並擋住新訊息,或另一個中繼正在使用該資料庫 重新啟動會等待執行中的回合、每個資料目錄一個中繼
新訊息一直留在佇列中,橫幅顯示 Relay restart queued — waiting for N sessions(中繼重新啟動已排隊 — 正在等待 N 個 session) 重新啟動已排入佇列,正在等待它所連結的 session 中執行中的回合;在那之前,不會有任何訊息交給 session 等待,或按橫幅中的 Restart now(立即重新啟動)或 Cancel restart(取消重新啟動)。經過 Ask after a queued relay restart has waited(排入佇列的中繼重新啟動等待多久後詢問)所設定的時間(預設 30 分鐘)後,橫幅會改為詢問你,而不是繼續等待。重新啟動會等待執行中的回合
中繼重新啟動後,送往某個對話的訊息一直留在佇列中 它的 worker 尚未重新連線。它會自行重試,間隔最多 8 秒;從 0.9.13 起,連線卡住時也會重試 它的 worker-<session>.log 中,每次失敗的嘗試都有一行 worker ws disconnected(前三次,之後每分鐘一次),說明原因。☠️ Kill session 會啟動新的 worker。無法連到 agent 時
中繼重新啟動後,某個 session 在回合中途停下,之後就沒有再做任何事 它的回合無法再次執行:agent 已經取走了訊息 傳送一則簡短的「繼續」,或在 Settings → General 中開啟 After a relay restart, tell interrupted sessions to carry on(中繼重新啟動後,讓中斷的 session 繼續)。說明中繼已重新啟動的 relay(中繼)列就是那則註記。告訴中斷的 session 繼續
傳送失敗,並顯示 This conversation's model "…" is no longer available. Choose a model and send again.(此對話的模型「…」已無法使用。請選擇模型後重新傳送。) 這次傳送沒有指定模型,而對話所設定的 Copilot 模型已從目錄中移除。從 0.9.13 起,中繼不再自行切換到其他模型 在輸入區中選擇模型,然後再傳送一次。模型與推理
Restart web relay 或 Empty queue(清空佇列)顯示錯誤 中繼拒絕了請求並說明原因,或沒有回應 Restart web relay、Empty queue
為中繼設定的變數對 agent 沒有作用 在 tmux 下,只有固定清單中的變數會傳到 agent 哪些變數會傳到 agent
回覆因 Paused(已暫停)註記而停止 用量上限 達到用量上限時
背景 agent 或 shell 自行停止了 它達到了 Background task timeout(背景任務逾時),預設為 4 小時 背景任務逾時
任務列以琥珀色顯示 no output for N min 指令沒有寫出任何東西的時間,超過了 Mark a background task as quiet after(背景任務多久無輸出後標記為靜默),預設為 10 分鐘 開啟它的主控台查看最後幾行。有些步驟會長時間沒有輸出;請調高這個設定,或在任務卡住時用 Stop 停止它。靜默任務
指令的主控台顯示 This session did not report an output file for this task.(此 session 未回報此任務的輸出檔案。) agent 在更新到 0.9.12 之前就已啟動的 session,或 Copilot SDK 引擎上沒有 Stop 的 shell 第二種情況,請在閒置的 session 上使用 ☠️ Kill session;之後的指令就會有主控台。依供應商
主控台顯示 This task's output is no longer available.(此任務的輸出已無法使用。) 任務在一個多小時前就已結束,或它在更新到 0.9.13 之前執行,而中繼之後重新啟動過 已結束的指令、中繼重新啟動之後
主控台停在 Output stops here: this command pipes into tail(輸出到此為止:此命令以管線傳給 tail) 以管線接到 tail 的指令在結束前不會寫出任何東西;輸出會在那時才到 若要即時追蹤這類執行,請讓它把記錄寫入檔案(> run.log 2>&1),然後追蹤那個檔案。管線接到 tail 的指令
中繼重新啟動後,主控台顯示正在等待它的 worker,而且沒有 Stop 中繼保留了指令的輸出,但只有它的 worker 能說明它是否仍在執行 等幾秒鐘。worker 沒有回來的指令,會在大約一分半鐘後被標記為已結束。中繼重新啟動之後
切回很長的對話時,你先前載入的較舊訊息沒有全部回來 只會在你所在位置周圍保留 Messages kept per conversation for switching back(每個對話保留的訊息數,用於切回)所設定的數量,預設為 200,且只限最近八個對話 在 Settings → General 中調高它。重新載入、切換、旋轉
對話無法刪除或封存 仍有回合或背景任務在執行 刪除
失敗的回覆顯示一個按鈕 中繼知道解法 失敗回覆上的按鈕
中繼停止或重新啟動了,記錄中寫著 JavaScript heap out of memory 0.9.19 新增 中繼的記憶體達到了堆積上限 中繼會自行重新啟動。中繼記憶體耗盡

提問與核准 #

你看到的現象 常見原因 解決方式
agent 在等待,卻什麼事都沒發生 有提問卡片或核准卡片開著,可能在另一個裝置上。等待卡片的回合絕不會被視為卡住 回答卡片,或按 Stop。卡片開啟期間
核准卡片不接受你輸入的回答 輸入文字不能用來表示同意 使用 Allow(允許)或 Deny(拒絕)。核准卡片
卡片消失了,agent 繼續執行 8 小時內沒有人回答(在 Copilot 擴充功能引擎上是 2 小時),或 Stop 關閉了它 卡片開啟期間
傳送按鈕顯示 Queue(加入佇列) 有卡片開著;訊息會在你回答後送出 卡片開啟期間
You are offline. Answer queued 你回答時沒有連線 從其他地方回答
Grok agent 提出問題,但沒有出現卡片 Grok 沒有卡片 在輸入區中回答。Grok
通知中缺少回答按鈕 問題沒有選項,或選項太長 通知

與其他 session 和中繼協作的 agent #

你看到的現象 常見原因 解決方式
agent 沒有 session 工具,或回報 REMOTE_RELAY_SESSION_LIMIT、REMOTE_RELAY_NESTED_SESSION 或 REMOTE_RELAY_PROVIDER_UNAVAILABLE 開關已關閉,或受到某個限制 Agent session
REMOTE_RELAY_LOCKED 你還沒有在這個對話中提及該中繼 配對的中繼
中繼顯示 Offline(離線)或 Token not accepted(Token 未被接受) 另一個中繼已停止,或它的 token 已變更 配對的中繼
其他中繼的 agent 無法在這裡傳送提示(REMOTE_INBOUND_DISABLED) Accept prompts from other relays' agents(接受其他中繼 agent 的提示)已關閉 配對的中繼
監看配對中繼上的 session 時,顯示它需要更新 另一個中繼執行的是較舊的 OAR 配對中繼上的 session
REMOTE_RELAY_UNKNOWN_MODEL agent 指定了目標中繼沒有為該供應商列出的模型,例如把 gpt-5.4 寫成 gpt-5-4 回答會列出相近的符合項目和有效的 id。接受哪些模型
shell 指令結束時,監看中的 agent 不再被喚醒 從 0.9.13 起,預設事件不包含順利結束的 shell 指令;失敗仍會喚醒它 在 events 中加入 task_finished 來訂閱。預設事件
任何其他 REMOTE_… 代碼 錯誤

檔案、預覽與分享 #

你看到的現象 常見原因 解決方式
點選回覆中的路徑時出現 File not found(找不到檔案) workspace 外的絕對路徑被當成 workspace 路徑讀取 回覆中的連結會開啟什麼、檢視器能開啟哪些檔案
檔案連結失敗,或檔案打不開 檔案在檢視器可讀取的範圍之外 檢視器能開啟哪些檔案
檔案瀏覽器中的資料夾開啟後是空的 中繼無法讀取它 限制
agent 應該提交、復原或推送,但 Git changes(Git 變更)沒有按鈕 那個檢視只顯示變更 它不做什麼
preview 連結打不開、顯示 No such preview 或 Preview upstream unreachable,或頁面一片空白 預覽通道已關閉、dev server 已停止,或 App 寫出了絕對路徑 預覽
Preview lane is disabled 或 Preview lane failed its startup checks 預覽通道已關閉,或某項檢查失敗 預覽通道拒絕啟動時
Too many live previews (max 8) 達到上限 預覽
分享連結要求觀看者登入、顯示舊的狀態,或其他人都打不開 Cloudflare Access、快取規則,或只在這台機器上監聽的中繼 連到中繼
分享連結回應 404 分享已停止、連結已更新,或對話已刪除 Settings → Sharing(設定 → 分享)會列出仍有效的連結。你的分享連結
分享檢視中仍顯示某個路徑 相對路徑,或圖片中的路徑 路徑和檔名
Settings → Previews(設定 → 預覽)中某個預覽顯示為未提供服務 中繼啟動時無法檢查它 每 15 秒會再檢查一次。重新啟動後的預覽

通知與已安裝的 App #

你看到的現象 常見原因 解決方式
通知開關呈灰色 頁面不是透過 HTTPS 或 localhost 開啟 通知
通知停止,或只送到一個裝置 在瀏覽器中被封鎖、裝置已停用,或另一個裝置在前景開著 OAR 通知
瀏覽器沒有提供安裝 中繼不是透過 HTTPS 或 localhost 提供 所需條件
App 顯示 Enter your access token to connect(輸入你的存取 token 以連線) App 中沒有有效的登入 在 App 中登入
Suspend host(讓主機休眠)不見了或沒有作用 它的設定已關閉、中繼不在 Windows 上,或仍有東西在執行 讓主機休眠

更新 #

你看到的現象 常見原因 解決方式
Update(更新)不見了,或檢查沒有找到任何東西 git checkout、已略過的版本,或不知道有更新的版本 無法正常運作時
Check for updates(檢查更新)呈灰色 中繼上設定了 OAR_NO_UPDATE_CHECK 無法正常運作時
oar update 以 1 結束並顯示 Could not fetch …,或指向 --to 無法取得 manifest,或檢查已關閉 oar update --to X.Y.Z 仍然可用。無法正常運作時
oar update --to=0.9.2 安裝了最新版本 --to= 會被忽略 請寫成 --to 0.9.2,中間用空格。oar update
更新因 EACCES 而失敗 npm 無法寫入套件的資料夾 無法正常運作時
更新後仍在執行舊版本 重新啟動在等待執行中的回合,或更新沒有套用 重新啟動會等待執行中的回合、無法正常運作時
已安裝的 App 顯示舊頁面 它會在啟動時切換到新版本 更新

中繼記憶體耗盡 0.9.19 新增 #

中繼啟動時帶有固定的堆積上限:機器 RAM 的 60%,以 64 MB 為單位,最少 2,048 MB,最多 8,192 MB,且絕不低於 Node.js 本身的預設值,但也絕不超過可用記憶體;在有記憶體限制的容器中,以該限制代替 RAM。在 4 GB 記憶體的機器上約為 2.3 GB。每次啟動都會在記錄中寫下上限及其來源:

[relay] heap limit 2368 MB (default: 60% of 3.9 GB RAM)

啟動時以及之後每 10 分鐘,記錄會多一行類似 [relay] memory rss=812 heapUsed=640 heapLimit=2560 的內容;使用中的堆積超過上限的 80% 時,還會多寫一行 [relay] memory high: …。

中繼記憶體耗盡時,會像任何當機之後一樣自行重新啟動:最多連續 2 次,連續第 3 次當機會讓它以結束代碼 1 停止,之後由 Linux 上的 systemd 服務再次啟動它。執行 10 分鐘以上會讓計數重新開始。在 0.9.19 之前,記憶體耗盡的中繼會一直停著。從較早的版本更新後,只有在 oar 本身停止並重新啟動一次之後,堆積上限和這種自動重新啟動才會生效(0.9.19 的升級說明)。

要自己設定上限,請在 config.json 中寫入 heapLimitMb(整數 MB,至少 512),然後重新啟動中繼。NODE_OPTIONS 中的 --max-old-space-size,或啟動 server.js 的 node 指令列上的該參數,優先於 heapLimitMb。與 heapLimitMb 不同,在 shell 中設定的 NODE_OPTIONS 會在其他程式重新啟動中繼時遺失。

堆積快照 #

堆積接近上限時,Node.js 會把一個堆積快照(Heap.<date>.<time>.<pid>.….heapsnapshot)寫入中繼資料目錄中的 diagnostics 資料夾(檔案與資料夾)。中繼在啟動時建立該資料夾,並在記錄中寫下它的路徑;在 Linux 和 macOS 上只有你能開啟它。

  • 磁碟:快照大約與使用中的堆積一樣大,最多到上限。資料目錄所在磁碟機的可用空間不足堆積上限的兩倍時,中繼會不寫快照就啟動,並在記錄中說明原因。
  • 記憶體:寫入快照最多可能需要約兩倍於使用中堆積的記憶體,寫入期間中繼不會回應。在小型機器上,寫入可能失敗,或讓處理程序被結束;這時中繼會像沒有快照時那樣結束。
  • 檢視:把它複製到別的機器上,在 Chrome DevTools 中透過 Memory → Load(記憶體 → 載入)開啟,依 Retained size(保留大小)排序,就能看出是什麼佔著記憶體。與之前一次正常執行的快照比較,可以看出什麼變大了。

快照中有你的機密資訊

堆積快照包含中繼記憶體中的所有內容,包括存取 token 和各供應商的 API 金鑰。絕不要原樣分享,讀完後請刪除:中繼從不刪除快照。

回報問題 #

如果上面的內容都沒有幫助,請在 github.com/oar-sh/oar/issues 提出 issue。請附上:

  • oar --version 的輸出;
  • oar doctor 的輸出,以及 oar status 的輸出;
  • 你做了什麼、預期會發生什麼、實際發生了什麼,並附上確切的訊息;
  • 與問題相符的記錄中的相關行(記錄),而不是整個檔案。

先移除機密資訊

張貼之前,請移除存取 token(包括位址中的 ?token= 部分)、API 金鑰和 tunnel token,並替換個人路徑、主機名稱和帳戶名稱。issue 是公開的。