Linux VPS 突然變慢時,最常見的錯誤不是不會重開機,而是還沒查出哪個程序有問題就先把整台主機重啟。比較穩的做法是先用 ps、top 或 htop 找到程序與 PID,確認它屬於哪個服務,再決定要重新啟動服務、送出正常結束訊號,或做進一步排錯。
你會學到什麼
- 分清楚程序、PID 與 systemd 服務。
- 找出 CPU 或記憶體使用量最高的程序。
- 理解
ps、top、htop、pgrep適合什麼情境。 - 知道
kill -15與kill -9的差別。 - 遇到
ps: command not found時安裝正確套件。
動手前先確認
- 你已經透過 SSH 登入 VPS。
- 你知道目前操作的是測試機還是正式主機。
- 如果要停止程序,先確認它是否承接網站、資料庫、Queue 或排程工作。
如果你連目錄與基本指令都還不熟,先看 Linux 終端機基礎教學;如果問題是某個服務啟動失敗,直接搭配 systemctl 與 journalctl 教學 會更快。
程序、PID 與服務有什麼不同
程序(process)是正在執行的程式實例,每個程序通常都有一個 PID。Nginx、Node.js、PHP-FPM、MySQL 都可能同時有多個程序。
systemd 服務則是管理程序的一層機制。若程式由 systemd 啟動,應優先用 systemctl status、restart 或 stop 管理,而不是隨意殺掉其中一個 PID,否則 systemd 可能立刻把它重新拉起來。
先看目前是否有失敗的服務:
systemctl --failed
ps 指令不存在要安裝什麼
Ubuntu、Debian 的 ps、top、free、pgrep 通常由 procps 套件提供。精簡容器或極小化系統若出現 ps: command not found,請安裝 procps,不是安裝名稱叫做 ps 的套件。
sudo apt update
sudo apt install procps
安裝後確認:
ps --version
top -v
用 ps 看目前有哪些程序
最常用的兩種查看方式:
ps -ef
ps aux
輸出很多時,可以直接列出最需要看的欄位,並依 CPU 使用量排序:
ps -eo pid,ppid,user,%cpu,%mem,etime,stat,cmd --sort=-%cpu | head -20
欄位可這樣理解:
| 欄位 | 意思 |
|---|---|
PID | 程序編號 |
PPID | 啟動它的父程序 |
%CPU | CPU 使用比例 |
%MEM | 記憶體使用比例 |
ETIME | 已執行多久 |
STAT | 程序目前狀態 |
CMD | 啟動指令與參數 |
不要只看到某個程序瞬間排第一就判定異常。編譯、壓縮、備份與更新都可能短時間吃滿 CPU,應連續觀察一段時間並核對服務日誌。
用 top 或 htop 即時觀察
top
在 top 畫面中,常用按鍵有:
P:依 CPU 排序。M:依記憶體排序。1:顯示每顆 CPU 核心。q:離開。
如果你比較習慣彩色與互動介面,可以安裝 htop:
sudo apt install htop
htop
看到 Load Average 很高,不一定代表 CPU 故障;磁碟 I/O 等待、大量不可中斷程序也可能把負載推高。可以再搭配:
uptime
free -h
df -h
如果磁碟已滿,請先看 Linux 磁碟空間不足排查。
用 pgrep 精準找 PID
知道程序名稱時,不需要在整份 ps 輸出裡慢慢找:
pgrep -a nginx
pgrep -af "node.*server.js"
-a 會顯示完整指令;-f 會比對完整 command line。動手停止前,先用完整輸出確認沒有選到其他同名服務。
正確停止程序:先 TERM,再考慮 KILL
正常停止指定 PID:
kill -15 12345
SIGTERM(15)讓程式有機會關閉連線、寫完資料與清理暫存。送出後先確認:
ps -p 12345 -o pid,stat,etime,cmd
只有在程序確定無法回應,而且你已評估資料風險時,才使用:
kill -9 12345
SIGKILL(9)不讓程式做收尾。資料庫、寫檔中的程式或 Queue worker 被強制終止,可能留下未完成交易、暫存檔或重複工作。
若它是 systemd 服務,應改用:
sudo systemctl status myapp
sudo systemctl restart myapp
sudo journalctl -u myapp -n 100 --no-pager
程序一直自己回來是什麼原因
常見原因包括:
- systemd 設定了
Restart=always或Restart=on-failure。 - Docker Compose 設定
restart: unless-stopped。 - Supervisor、PM2 或其他程序管理器正在監控它。
- Cron 或 systemd timer 定期啟動同一支程式。
這時一直 kill 不是解法。先找出真正的管理者,再從服務設定與日誌處理。
新手最常犯的錯
- 把 CPU 瞬間升高當成持續異常。
- 沒看完整 command line 就用
pkill或killall。 - 一開始就使用
kill -9。 - 只重啟程序,沒有看它為什麼失敗。
- 在正式主機停止資料庫或 Queue,卻沒有確認影響範圍。
做完後怎麼確認
systemctl --failed
ps -eo pid,user,%cpu,%mem,etime,cmd --sort=-%cpu | head -15
free -h
uptime
確認異常程序已消失或恢復正常、服務日誌沒有持續報錯,而且網站或 API 的實際請求能成功。
下一步
- 服務啟動失敗:Linux 服務與日誌排查
- 主機容量不足:VPS 規格選擇指南
- 網站回應異常:curl HTTP 與 API 排錯教學
- 需要可自行管理的環境:VPS 方案與價格