管理一台正式環境的伺服器,日常大概是這樣:SSH 進去,top 看一下 CPU,systemctl status 挑幾個服務確認,df -h 看磁碟,ss -tunap 看連線,docker ps 看容器,再開幾個分頁 tail -f 服務的紀錄檔。哪個服務掉了、哪顆磁碟快滿了,答案分散在七八個指令裡,沒有人會把這些指令背熟,每次都是現查。
Sentro 是一支 Rust 寫的終端機管理主控台,把這些指令收進一個畫面。SSH 上去、打 sentro,一個全螢幕 TUI 立刻列出服務、行程、CPU、記憶體、磁碟、網路、Docker 容器、系統紀錄、登入連線、排程——十七個分頁,Tab 或數字鍵切換,不需要 X11、不需要瀏覽器,純終端機就能跑。
長什麼樣子
畫面分三塊:最上面是分頁列,中間是當前分頁的內容,最下面兩行是狀態列——第一行是操作提示,第二行是常駐的 F1~F10 功能鍵。數字鍵 1~9 可以直接跳到對應分頁,10 個以後的分頁用 Alt+字母;也可以按 m 或 F2 開一個選單,列出全部十七個分頁慢慢選。
這裡有個小教訓:一開始跳頁是裸鍵(按 a 直接跳到某頁),後來發現只要某個分頁自己也想用這個字母做別的事,兩邊就打架——按 g 想在檔案管理員裡「前往目錄」,卻先被全域跳頁劫走。改成裸字母永遠留給分頁自己用、跳頁一定要按 Alt,才把這個衝突徹底解決掉。
總覽頁本身很單純:上面一張卡片彙總服務健康、容器狀態、告警數量、可用記憶體、負載、登入連線與排程數量;下面是問題清單,只列出真正該注意的項目,選一列按 Enter 直接跳到出問題的那個分頁。
十七個分頁
服務健康
依設定檔裡列出的服務逐一檢查:systemd/launchd 狀態、連接埠有沒有在監聽、HTTP 健康檢查的狀態碼與延遲。連接埠沒監聽但服務顯示「運行中」,這種「看起來活著但其實卡死」的狀況會特別標紅——這正是只看 systemctl status 會漏掉的情況。
服務
系統上所有服務的清單,可以直接按 s/x/R 啟動、停止、重啟,不用再去記完整的 unit 名稱敲指令。Linux 用 systemd,macOS 用 launchd,畫面欄位一樣,底層指令換了一套。
行程
類似 top,可依 CPU、記憶體、名稱排序,篩選找特定行程,K 直接送 kill。多了一個 top 沒有的功能:選中一個行程按 M,會開一個記憶體地圖,讀 /proc/pid/maps 把每個記憶體區段畫成一排排色塊——青色可執行、綠色可寫、藍色唯讀——想抓記憶體洩漏或看某個行程的位址空間長什麼樣,比對照 /proc/pid/maps 的文字輸出直覺很多。這功能讀的是 Linux 才有的 /proc,macOS 因為 SIP 限制讀不到,畫面上會直接說明,不會裝作有資料。
CPU
逐核心的使用率量條,上面疊一條近期趨勢的走勢圖。macOS 沒有 /proc/stat 那種現成的累計 tick 計數器,改用 top -l 1 -n 0 的瞬時忙碌率換算成一個單調遞增的計數器,讓前後兩次取樣的差值算法可以照抄 Linux 那套——代價是 macOS 上只有整機一筆數字,沒有逐核心資料,畫面標題會老實寫「僅整機彙總」,不會裝出好幾顆核心的假象。
記憶體
記憶體跟交換空間各一條量條,加一張使用率趨勢圖。下面特別寫了一句提醒:「可用」記憶體包含可以隨時回收的快取,跟「完全空閒」是兩件事,只看空閒量很容易誤判記憶體壓力——這是很多人在看 free -h 時最容易搞混的地方。
磁碟
列出所有掛載點的容量、已用、可用、使用率,會自動排除暫存與系統快照掛載點(例如 macOS 的 /System/Volumes/*),不然一台 Mac 開起來磁碟清單可以有十幾條,一半是系統內部用的快照,看了也沒意義。
網路
三層資訊疊在一起:上面接收/傳送的即時走勢,中間各網卡的累計流量與錯誤/丟棄計數,下面是完整的連線清單,可以看到每條連線對應哪個 PID、哪個服務。等待關閉(CLOSE-WAIT)或收送佇列堆積的連線會標紅,這種連線通常代表對面沒有正常關閉,值得盯著看。Linux 用 ss,macOS 沒有這個指令,改解析 lsof -F 的結構化輸出——lsof 的表格輸出會把指令名稱截成 9 個字元,-F 這種欄位模式才不會把長一點的服務名稱切斷。
平台
上半顯示 Postgres、Redis、RabbitMQ 這類基礎服務是否連得上、延遲多少;下半是 Docker 容器清單,跑不起來的容器會直接標紅。如果 Docker 沒裝或連不上,這裡不會空白帶過,會把錯誤訊息直接寫在標題上。
紀錄
系統層級的警告與錯誤,Linux 是 journalctl -p 0..4,macOS 是統一日誌(unified log)配合 messageType >= 16 的 predicate 篩掉大部分雜訊。這裡有個踩過的坑:macOS 的 log show 沒有 predicate 直接掃一天份量,實測要 30 秒以上,會把整個畫面刷新卡住;加上 predicate 之後查 1 小時穩定在 2 秒內。所以 macOS 上「今天」「全部」這兩個時間範圍選項其實都被封頂在最近 1 小時——與其讓使用者以為自己看到一整天的紀錄,畫面上的標籤會照實寫「最近 1 小時(效能考量)」。
服務紀錄
跟系統紀錄不同,這頁是服務自己輸出的應用層紀錄檔(例如 Laravel 的 storage/logs),從服務清單一路點進去選檔案、開檔案,F 開自動追蹤(每 2 秒重新讀取),/ 在目前檔案內搜,S 一次搜整個服務的所有紀錄檔。要掃到哪個目錄底下的哪個子路徑,靠設定檔裡的 log_scan_root 跟 log_subdir_pattern 指定。
登入連線
目前的登入工作階段,誰在什麼座位、什麼 TTY、閒置多久、什麼時候登入。伺服器忽然變慢,先看這裡有沒有異常的登入,通常比在一堆行程裡面找更快。
排程
一排排程一列,橫向 24 個時段,藍色是目前時段,一眼就看得出接下來一小時內會不會有排程要跑。這頁有個明確講清楚的限制:macOS 上 launchd 沒有一個指令能一次列出全部工作連同下次執行時間,要準確的話得對每個已載入的 job 各跑一次 launchctl print——這台測試機上有五百多個 job,全部查一輪會嚴重拖慢畫面刷新。所以 macOS 這頁只顯示使用者自己的 crontab,標題上會註明「僅 crontab,不含 launchd 排程」,免得看到「0 筆」就以為這台機器沒有任何排程工作。
設定說明
內嵌的設定檔說明文件,不用切出去開瀏覽器查 README。服務怎麼設定、macOS 上 unit 欄位要填 launchd label 而不是 systemd 名稱、排序置頂規則怎麼寫,都在這頁。
檔案管理員
左右兩個面板各自瀏覽,Tab 切換作用面板,標記多個項目後 c 複製到另一側、d 刪除、z 打包成 .tar.gz。開啟 zip、tar.gz、tar.bz2、tar.xz 這類壓縮檔會先問要不要解壓到目前目錄;p 可以逐行比對兩個面板裡選中的檔案,用內建的差異演算法標出新增、刪除的行,不用另外裝 diff。
打開文字檔會進到檢視模式,這裡有語法高亮:
最早想直接掛 syntect——功能齊全、語法定義等同 Sublime Text——結果一裝下去,Cargo.lock 被升到 v4 格式,而發布用的 Docker image 釘死在 Ubuntu 24.04 內建的 Rust 1.75,那個版本的 cargo 連 v4 格式的 lockfile 都讀不懂,整條 Linux 建置直接壞掉。改成自己刻一個不靠任何套件的逐行 tokenizer,認關鍵字、字串、註解、數字四種,區塊註解跟三引號字串的跨行狀態自己維護,涵蓋 Rust、Python、JS/TS、Go、C/C++、Java、JSON、YAML、TOML、Shell 這些常見副檔名。換來的是零額外依賴、編譯速度不受影響,代價是語法規則比正規的語法引擎陽春一些——對一個終端機檢視器來說,這筆交易划算。按 h 可以切到 HEX 檢視,/ 在 HEX 模式下搜尋位元組。
開啟的檔案
基於 lsof,列出目前有哪些檔案被開啟、各被幾個行程持有,選一個檔案按 Enter 可以看到是哪些行程開的,再往下鑽可以看到行程詳情。刪磁碟空間前想確認某個大檔案是不是還被誰佔用,這頁比自己輸入一長串 lsof 參數方便。
設定編輯
直接在 TUI 裡編輯 config.toml,不用切出去用 vi。新增服務走一個小精靈,一步一步問名稱、unit、連接埠;改完按「儲存設定」寫回原檔案。
現在
Sentro 目前是純執行檔發佈:Linux 用 Docker 交叉建置出 arm64 跟 amd64,macOS 原生編譯 arm64,最後產生一份 SHA256SUMS.txt。不用裝任何東西,把執行檔丟到伺服器上、chmod +x、直接跑。
日常維運的動作沒有變,SSH 上去、top、systemctl、df、ss、docker ps、tail -f——只是現在這些動作都收在同一個畫面裡,不用在分頁之間跳來跳去現查指令。