Linux 程序管理教學:ps、top、htop、kill 新手排錯指南

VPS 變慢、CPU 滿載或程式卡住時,先用 ps、top、htop、pgrep 找到程序與 PID,再用正確訊號停止。本文也說明 ps 指令不存在時該安裝哪個套件。

Linux程序管理pstophtopkillpgrepPIDprocpsVPSCPU記憶體伺服器排錯

Linux VPS 突然變慢時,最常見的錯誤不是不會重開機,而是還沒查出哪個程序有問題就先把整台主機重啟。比較穩的做法是先用 pstophtop 找到程序與 PID,確認它屬於哪個服務,再決定要重新啟動服務、送出正常結束訊號,或做進一步排錯。

你會學到什麼

  • 分清楚程序、PID 與 systemd 服務。
  • 找出 CPU 或記憶體使用量最高的程序。
  • 理解 pstophtoppgrep 適合什麼情境。
  • 知道 kill -15kill -9 的差別。
  • 遇到 ps: command not found 時安裝正確套件。

動手前先確認

  • 你已經透過 SSH 登入 VPS。
  • 你知道目前操作的是測試機還是正式主機。
  • 如果要停止程序,先確認它是否承接網站、資料庫、Queue 或排程工作。

如果你連目錄與基本指令都還不熟,先看 Linux 終端機基礎教學;如果問題是某個服務啟動失敗,直接搭配 systemctl 與 journalctl 教學 會更快。

程序、PID 與服務有什麼不同

程序(process)是正在執行的程式實例,每個程序通常都有一個 PID。Nginx、Node.js、PHP-FPM、MySQL 都可能同時有多個程序。

systemd 服務則是管理程序的一層機制。若程式由 systemd 啟動,應優先用 systemctl statusrestartstop 管理,而不是隨意殺掉其中一個 PID,否則 systemd 可能立刻把它重新拉起來。

先看目前是否有失敗的服務:

systemctl --failed

ps 指令不存在要安裝什麼

Ubuntu、Debian 的 pstopfreepgrep 通常由 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啟動它的父程序
%CPUCPU 使用比例
%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=alwaysRestart=on-failure
  • Docker Compose 設定 restart: unless-stopped
  • Supervisor、PM2 或其他程序管理器正在監控它。
  • Cron 或 systemd timer 定期啟動同一支程式。

這時一直 kill 不是解法。先找出真正的管理者,再從服務設定與日誌處理。

新手最常犯的錯

  • 把 CPU 瞬間升高當成持續異常。
  • 沒看完整 command line 就用 pkillkillall
  • 一開始就使用 kill -9
  • 只重啟程序,沒有看它為什麼失敗。
  • 在正式主機停止資料庫或 Queue,卻沒有確認影響範圍。

做完後怎麼確認

systemctl --failed
ps -eo pid,user,%cpu,%mem,etime,cmd --sort=-%cpu | head -15
free -h
uptime

確認異常程序已消失或恢復正常、服務日誌沒有持續報錯,而且網站或 API 的實際請求能成功。

下一步

參考資料

需要一台可自行部署的 VPS?

適合 Node.js、Docker、API、背景服務與需要 root 權限的工作負載;也要把更新、備份與監控算進去。