Personal Knowledge Base

修哥筆記

「知識的沉澱與分享」

Hermes Agent on Ubuntu:如何查詢執行、如何啟動、如何開機自動背景常駐

· #Hermes #systemd #Ubuntu #技術隨筆

Hermes Agent 是 Nous Research 推出的開源 AI agent 框架,有 CLI、桌面版、網頁 dashboard、訊息平台閘道(gateway)等多種執行面向。把對話之外的長駐程序(尤其是負責連接 Telegram / Discord / WhatsApp 等平台的 gateway)交給 systemd 管理,是官方設計的最穩健做法。這篇整理 Ubuntu 上的三個實務問題:如何查詢 Hermes 是否執行中、如何啟動,以及如何讓它重開機後自動在背景常駐。

好消息是:官方其實內建了一組直接可用的「一鍵指令」,不用自己寫 service 檔。 這篇會以官方指令為主,再附上它背後的手動 systemd 原理。

一、Hermes Agent 有哪些執行方式要先分清楚

動手之前,先釐清 Hermes 有兩種性質完全不同的執行:

  • 互動式 CLI:你在終端機裡 hermes 直接對話那支。它是「一開一關」的,不需要常駐,SSH 斷線就結束。
  • 長駐程序(gateway / dashboard):負責在背景持續接收訊息、執行排程任務。這才是需要「開機自動啟、崩潰自動重啟、崩潰後有 log」的對象。

官方設計裡,長駐程序交給內建的 hermes gateway 指令集管理,而不是裸用 nohup 或 tmux。

二、如何查詢 Hermes 是否執行中

最直接的是用官方內建的狀態指令:

hermes gateway status

它會顯示 systemd 服務是否 active (running)、Main PID、佔用記憶體、最近 log,並在最後總結兩件事:服務是否在跑、lingering(背景存活)是否已啟用。例如:

✓ User gateway service is running
✓ Systemd linger is enabled (service survives logout)

若沒用系統服務管理、只想肉眼確認,也可以:

ps -ef | grep hermes

寫作日期當下,這支指令還支援 hermes gateway status 之外的其他子指令,見下節。官方 health check hermes status 則會回報 provider 登入狀態。

三、如何啟動 Hermes

  • 互動對話(前台):hermes
  • 單次提問(可背景執行):hermes chat -q "問題"
  • Web 管理面板:hermes dashboard
  • 訊息平台閘道(長駐):交給 hermes gateway 指令集,見下節。

四、最簡單做法:官方一鍵指令(推薦)

hermes gateway 提供完整的服務管理子指令:

hermes gateway install      # 裝成 systemd/launchd 背景服務,開機自動啟動
hermes gateway start        # 手動啟動背景服務
hermes gateway stop         # 停止服務
hermes gateway restart      # 重啟服務
hermes gateway status       # 查詢執行狀態
hermes gateway uninstall    # 反安裝服務
hermes gateway list         # 列出所有 profile 與其 gateway 狀態

其中 install 是「開機自動背景常駐」的核心。它會自動產生 systemd service 檔、設定好開機啟動、並啟用 lingering,一次性搞定最繁瑣的部分。install 支援的選項:

選項 作用
--system 安裝成 Linux 系統層級服務(開機就啟動,不需登入)
--run-as-user USER 系統層級服務要執行的使用者帳號
--start-now / --no-start-now 安裝後是否立即啟動服務
--start-on-login / --no-start-on-login 是否讓服務在登入/開機時自動啟動
--force 強制重新安裝

常用組合(單人主機,預設是使用者層級服務):

hermes gateway install --start-now

這樣一次就完成「裝服務 + 開機自動啟動 + 立即啟動」。之後是重開機也能自動背景常駐;需要手動管控時用 start / stop / restart / status。

install 產生的 service 檔長這樣(內容以官方產生為準),關鍵設定全部由官方代勞:

[Unit]
Description=Hermes Agent Gateway - Messaging Platform Integration
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=<hermes> gateway run
WorkingDirectory=<HERMES_HOME>
Environment="PATH=<...>"
Environment="HERMES_HOME=<HERMES_HOME>"
Restart=always
RestartSec=5
KillMode=mixed

[Install]
WantedBy=default.target

五、背後的原理:systemd 與 lingering

官方指令幫你做的事,其實就是「手動建 systemd 服務」的標準流程。Ubuntu 上長駐程序自動啟動的主流做法是把它包成 systemd 服務,有兩種層級。

方式 A:使用者層級 systemd(推薦單人主機)

service 檔放在 ~/.config/systemd/user/,啟用與啟動:

systemctl --user daemon-reload
systemctl --user enable --now hermes-gateway

關鍵一步:讓使用者服務在「沒有登入」時也能在開機時跑起來,必須啟用 linger:

sudo loginctl enable-linger <user>
loginctl show-user <user> | grep Linger   # 驗證結果應為 yes

少了 linger,使用者服務只會在該使用者登入時才啟動,開機時不會自動拉起。官方 hermes gateway install 已自動處理這一步。

方式 B:系統層級 systemd(多人/無需登入也想開機即跑)

service 檔放 /etc/systemd/system/,[Service] 指定執行身分、[Install] 用 WantedBy=multi-user.target;啟用用 sudo systemctl enable --now。對應到官方指令就是 hermes gateway install --system --run-as-user <user>。

坊間的 nohup / tmux 做法(不推薦)

nohup hermes gateway run > ~/.hermes/logs/gateway.log 2>&1 &
tmux new -s hermes 'hermes gateway run'

這兩種都能「背景執行」,但重開機後不會自動回來、崩潰不會自動重啟、log 管理也比較散。當作臨時手段可以,長期讓 gateway 常駐還是用官方指令或 systemd 為佳。

六、手動 service 檔的關鍵設定一次看懂

如果你偏好手動寫,或想理解官方指令做了什麼:

  • [Unit] 的 After=network-online.target + Wants=network-online.target:等網路就緒再啟動。沒有它,開機時 DNS 還沒好的那幾秒會連線失敗、重啟、再失敗。
  • Type=simple:適合 hermes gateway run 這類「會一直在前景跑」的程序。
  • Restart=on-failure / Restart=always + RestartSec:崩潰時自動重啟。
  • Environment=...:明設 PATH、HOME、HERMES_HOME。這點很重要——systemd 環境很乾淨,若不指定,hermes 指令可能「找不到」或用到錯誤的資料目錄。
  • [Install] 的 WantedBy:使用者層級用 default.target,系統層級用 multi-user.target。

七、實務範例(一台用官方 install 設好的 Ubuntu 主機)

以下是一台已用 hermes gateway install --start-now 設定完成的 Ubuntu 主機,實際查詢結果:

$ hermes gateway status
● hermes-gateway.service - Hermes Agent Gateway - Messaging Platform Integration
     Loaded: loaded (.../hermes-gateway.service; enabled; preset: enabled)
     Active: active (running)
   Main PID: 984 (hermes)
     CGroup: .../hermes-gateway.service
             ├─984 ... python -m hermes_cli.main gateway run
             └─1121 ... node .../whatsapp-bridge/bridge.js --session ... --mode self-chat
✓ User gateway service is running
✓ Systemd linger is enabled (service survives logout)

關鍵字都到位了:服務 enabled、active (running)、linger 已啟用。就算重開機,systemd 也會在網路就緒後自動把 gateway 拉起。

八、驗證與除錯

hermes gateway status                       # 官方摘要:是否執行、linger 是否啟用
systemctl --user status hermes-gateway      # 服務層級狀態(使用者服務)
journalctl --user -u hermes-gateway.service -f   # 即時看 log
systemctl --user list-unit-files | grep hermes   # 看哪些 hermes 服務 enabled

如果看到 activating (auto-restart) 或 failed,通常是開機時網路還沒就緒、PATH/HERMES_HOME 不對,或 service 檔語法有誤。用 journalctl 看最新 log 最直接。

結論

讓 Hermes 長駐、處理訊息平台與排程任務,最務實的路線是:用官方內建的 hermes gateway install 一鍵把 gateway 裝成背景服務,它會自動建好 systemd unit、設定開機自動啟動並啟用 linger。之後用 start / stop / restart / status 管理、重開機自動背景常駐都由 systemd 處理。想了解細節或做進階設定,再對照這篇的手動 systemd 原理即可。


參考來源:

← 返回首頁