February 22Feb 22 Debian 13 查詢執行的進程 (Process) + 管理 + 維運 ------ 前言 ------ 在 Linux 系統管理中,掌握「目前系統正在執行哪些進程(Process)」是基本且重要的技能。無論是: 排查 CPU 或記憶體資源占用過高 找出異常或惡意進程 確認某項服務是否正常啟動 分析系統效能瓶頸 都需要依賴進程查詢工具 ------------------------- 什麼是進程 (Process)? ------------------------- 進程是作業系統分配資源、排程執行的基本單位,每個正在執行的程式都是一個或多個進程 每個進程都有唯一的 PID (Process ID),以及一個父進程 PPID (Parent PID) 進程之間形成樹狀結構,systemd (PID 1) 是所有用戶空間進程的根 進程狀態說明 Linux 進程有以下幾種狀態,在 top / ps 的狀態欄 (S 欄) 中以單一字母表示: 代碼 狀態名稱 說明 R 執行中 (Running) 正在CPU上執行,或在執行佇列中等待 S 休眠 (Sleeping) 可中斷休眠,等待事件 (如 I/O 完成),可被訊號喚醒 D 不可中斷休眠 通常是等待磁碟 I/O,不可被訊號中斷,出現大量 D 表示 I/O 瓶頸 Z 殭屍 (Zombie) 已結束但父程序尚未回收,佔用 PID,不佔 CPU/記憶體 T 已停止 (Stopped) 收到 SIGSTOP 或 SIGTSTP (Ctrl+Z) 而暫停 I 閒置 (Idle) 核心執行緒閒置中,Debian 新版核心出現 -------------------------------- 使用 top 指令 (即時動態監控) -------------------------------- top 是 Linux 系統預設安裝的即時進程監控工具 啟動後會以全螢幕模式持續更新,顯示 CPU 使用率、記憶體用量、進程列表等資訊,預設每 3 秒刷新一次 基本指令 top top介面說明 系統摘要區 (前5行) 系統時間、開機時間、登入人數 CPU 使用率 (us:使用者、sy:系統、ni:優先級調整、id:閒置、wa:I/O 等待、hi:硬體中斷、si:軟體中斷、st:虛擬機器偷取時間) 記憶體使用情況 (總量、已用、空閒、緩衝/快取) Swap 使用情況 (總量、已用、空閒、可用記憶體) 程序列表區 PID:程序 ID USER:執行程序的用戶 PR:優先級 NI:Nice 值 (優先級調整) VIRT:虛擬記憶體使用量 RES:實際實體記憶體使用量 SHR:共享記憶體使用量 S:程序狀態 (R:執行中、S:休眠、D:不可中斷休眠、Z:殭屍、T:停止) %CPU:CPU 使用率 %MEM:記憶體使用率 TIME+:累積 CPU 使用時間 COMMAND:程序名稱 常用操作按鍵 按鍵 功能說明 q 離開 top h 顯示說明 k 終止程序 (需輸入 PID) u 只顯示特定用戶的程序 M 依記憶體使用率排序 P 依 CPU 使用率排序 N 依 PID 排序 T 依累積時間排序 1 顯示各別 CPU 核心狀態 c 切換顯示完整指令路徑 space 立即刷新畫面 d 或 s 變更刷新間隔 (秒) r 調整 Nice 值 f 進入欄位管理畫面 (可新增/移除顯示欄位) W 儲存目前的 top 設定到 ~/.toprc 進階使用技巧 只顯示特定用戶的程序 top -u username 設定更新頻率 (單位:秒) top -d 3 在批次模式下執行一次後結束 (適合寫入腳本) top -b -n 1 監控特定 PID top -p 1234,5678 搭配 pgrep 動態監控特定程序 top -p $(pgrep -d',' nginx) 建議 top 的設定會儲存在 ~/.toprc。按 W 可儲存目前設定,下次啟動時自動套用 ------------------------------- 使用 htop 指令 (增強版 top) ------------------------------- htop 是 top 的加強版,提供彩色化介面、滑鼠支援、更直覺的操作方式,以及樹狀進程顯示 它不是系統預設安裝的工具,需要手動安裝 更新套件庫 apt update 安裝 htop apt install htop 基本指令 htop htop 特色功能 彩色介面:直觀顯示不同類型的資訊,CPU 條以不同顏色區分 user/system/nice/I/O wait 滑鼠支援:可直接點擊排序欄位、選取進程、按選單按鈕 樹狀結構:按 F5 顯示進程的父子關係,一目了然 垂直/水平捲動:可查看完整的指令列 進程標記:可同時標記多個進程進行批次操作 圖形化顯示:CPU、記憶體、Swap 使用條 (可在設定中調整顯示內容) 即時搜尋:按 F3 可即時過濾搜尋進程名稱 常用操作按鍵 按鍵 功能說明 F1 顯示說明 F2 進入設定 (可調整顯示欄位、顏色主題) F3 搜尋程序名稱 F4 過濾程序 (只顯示符合條件的) F5 切換樹狀檢視 (顯示父子關係) F6 選擇排序方式 F7 / F8 調整 Nice 值 (F7 降低 / F8 提高優先級) F9 終止程序 (可互動選擇訊號類型) F10 離開 htop 空白鍵 標記/取消標記進程 (可批次操作) u 切換顯示特定用戶的程序 t 切換樹狀模式 I 反轉排序方向 H 切換顯示/隱藏使用者執行緒 K 切換顯示/隱藏核心執行緒 實用參數範例 只顯示特定用戶的程序 htop -u username 以樹狀結構啟動 htop -t 依 CPU 使用率排序啟動 htop --sort-key PERCENT_CPU 建議 htop 的設定儲存在 ~/.config/htop/htoprc 按 F2 進入設定介面,可調整顯示欄位、顏色主題、Meter 顯示方式,並選擇在啟動時預設使用樹狀檢視 設定會在按 F10 離開時自動儲存 --------------------------- 使用 ps 指令 (靜態查詢) --------------------------- ps (Process Status) 是以快照方式列出進程清單的工具,執行後立即輸出當下的進程狀態並退出,不像 top / htop 那樣持續刷新 ps 非常適合與其他指令搭配,例如 grep、awk,或在 Shell 指令稿中使用 基本用法 顯示目前終端機的程序 ps 顯示所有程序 ps -e 或 ps -A 完整程序列表 (最常用) ps aux 參數說明: a:顯示所有終端機的程序 u:以用戶為導向顯示詳細資訊 x:顯示沒有控制終端的程序 顯示程序樹 (包含子程序) ps -axjf 或 ps -ef --forest 參數說明: -a:顯示所有終端機的程序 -x:顯示沒有控制終端的程序 -j:使用工作格式 (jobs format) f:以樹狀結構顯示 ------------------ 自訂顯示欄位 ------------------ 只顯示特定欄位,並依 CPU 排序 ps -eo pid,ppid,user,cmd,%cpu,%mem --sort=-%cpu 顯示完整指令路徑 ps -ef 顯示進程啟動時間 ps -eo pid,ppid,user,start,time,cmd --sort=start ---------------- 常用過濾技巧 ---------------- ---------------- 依程序名稱搜尋 ---------------- ps aux | grep nginx 排除 grep 本身 ps aux | grep nginx | grep -v grep 更專業的寫法 ps aux | grep '[n]ginx' ------------- 依用戶過濾 ------------- ps -u username 顯示 root 用戶的程序 ps -U root -u root ------------- 依 PID 查詢 ------------- ps -p 1234 ps -p 1234,5678 ---------------------------- 顯示特定程序的所有執行緒 ---------------------------- ps -L -p 1234 ---------------- 進階過濾範例 ---------------- 顯示所有殭屍進程 ps aux | awk '$8=="Z"' 顯示CPU使用率超過 50% 的進程 ps aux --sort=-%cpu | awk '$3>50' 查詢特定指令的 PID (輸出只有數字,適合腳本) ps -C nginx -o pid= 依記憶體使用排序,取前10名 ps aux --sort=-%mem | head -11 -------------------------------- lsof 查詢連接埠與開啟的檔案 -------------------------------- lsof 可以顯示系統中所有開啟的檔案 (在Linux中,網路連接、Socket、設備也都是「檔案」) 想知道是哪個程式佔用了特定連接埠,lsof 是最直接的工具 安裝 lsof apt install lsof 基本用法 查詢佔用 TCP/UDP port 80 的程序 lsof -i :80 查詢特定協定 lsof -i tcp:22 lsof -i udp:53 顯示所有監聽中的連接埠 (-P 不解析埠號名稱,-n 不解析主機名) lsof -i -P -n | grep LISTEN 警告 lsof 需要 root 或 sudo 權限才能查看所有進程的連接。一般使用者只能看到自己的程序 其他實用查詢 查詢某個檔案被哪些程序使用 lsof /var/log/syslog 查詢某個用戶開啟的檔案 lsof -u username 查詢某個程序開啟的檔案 lsof -p 1234 查詢程序正在監聽哪些 port (結合 netstat) netstat -tulpn | grep :80 或使用較新的 ss 指令 ss -tulpn | grep :80 注意 現代Debian系統中,ss 指令 (來自 iproute2 套件) 已取代 netstat 成為推薦工具 若 netstat 未安裝,可執行:apt install net-tools 安裝,或改用 ss -------------- 終止進程 kill -------------- 終止進程最常用的三種方式:使用 PID、使用程序名稱、使用 htop 互動介面 在動手之前,建議先了解Linux訊號機制 Linux 訊號(Signal)說明 訊號名稱 數值 說明 TERM (15) 15 正常終止(預設,程序有機會清理後退出) HUP (1) 1 重新載入設定檔(不停止程序,常用於 nginx / sshd) INT (2) 2 中斷程序(等同 Ctrl+C) KILL (9) 9 強制終止(無法被忽略,最後手段) STOP (19) 19 暫停程序(程序仍在記憶體中,可用 CONT 恢復) CONT (18) 18 繼續已暫停的程序 USR1 (10) 10 用戶自定義訊號(許多程序用於重開日誌) USR2 (12) 12 用戶自定義訊號(依程式而定) 警告 kill -9 (SIGKILL) 是最後手段 SIGKILL 強制由核心終止進程,程序無法進行任何清理動作,可能造成資料遺失、鎖定檔未釋放、資料庫損毀 請優先使用 SIGTERM (kill -15 或直接 kill),給程序機會優雅地關閉 方法一:使用 PID 正常終止(預設,等同 kill -15 或 kill -TERM) kill PID 強制終止(最後手段) kill -9 PID 重新載入設定(不停止服務,常用於 nginx、sshd) kill -HUP PID 終止多個 PID kill 1234 5678 9012 方法二:使用程序名稱 pkill:依名稱模糊匹配(部分符合即可) pkill nginx 匹配完整指令(包含參數) pkill -f 'python script.py' 只終止特定用戶的程序 pkill -u username nginx killall:完全匹配名稱 killall nginx killall -9 nginx 注意 pkill 和 killall 的差別:pkill 使用正規表達式(regex)進行模糊匹配;killall 需要完全符合程序名稱 使用 pkill -f 可以匹配完整指令列,當程序名稱相同但啟動參數不同時很有用 方法三:使用 htop 互動介面 在清單中選取目標進程後,按 F9 選擇訊號類型 htop ------------------------- 安全終止的最佳實務 ------------------------- 建議按以下順序嘗試 1.優先使用服務管理工具(自動處理依賴關係) systemctl stop nginx 2.使用正常終止,讓程序自行清理 kill PID 3.等待幾秒後確認(若程序仍存在再考慮下一步) ps -p PID 4.最後才用強制終止 kill -9 PID ----------------------- 進階應用與實用技巧 ----------------------- 即時監控特定程序 使用 watch 搭配 ps watch -n 1 'ps aux | grep nginx' 每秒更新一次,適合快速監控服務狀態 使用 top 過濾特定進程 top -p $(pgrep -d',' nginx) 僅顯示指定的PID 自訂監控腳本 (適合嵌入日誌) while true; do clear echo "=== $(date) ===" ps aux --sort=-%cpu | head -20 sleep 2 done 查詢 /proc 目錄 (進階分析) /proc 是虛擬檔案系統,內含每個進程的執行狀態: 查看執行檔路徑 ls -l /proc/PID/exe 查看開啟的檔案 ls -l /proc/PID/fd 查看環境變數 cat /proc/PID/environ | tr '\0' '\n' 查看記憶體映射 cat /proc/PID/maps 查看詳細統計 cat /proc/PID/status 資源排序快速指令 前10名CPU使用率 ps aux --sort=-%cpu | head -11 前10名記憶體使用率 ps aux --sort=-%mem | head -11 前10名累積CPU時間 ps aux --sort=-time | head -11 使用 pgrep 依名稱取得PID pgrep 是搜尋進程 PID 的專用工具,比 ps aux | grep 更簡潔: 取得nginx的所有PID pgrep nginx 顯示PID和進程名稱 pgrep -la nginx 只匹配精確名稱 (非子字串) pgrep -x nginx 搭配 top 使用 top -p $(pgrep -d',' nginx) ---------------------------- btop 現代化圖形化監控 ---------------------------- btop 是比 htop 更現代化的互動式系統監控工具,提供圖形化的CPU、記憶體、網路、磁碟使用率圖表,以及可自訂主題的美觀介面 Debian 13 的官方倉庫已收錄 btop 安裝 btop apt install btop 使用 btop btop btop 特色 圖形化 CPU、記憶體、網路、磁碟的即時折線圖 滑鼠支援,可點擊操作 可自訂顏色主題(按 ESC 進入選單) 進程樹狀顯示 可篩選進程、依各種欄位排序 顯示網路介面流量(上傳/下載速率) 顯示磁碟讀寫速率 注意 若系統資源有限,btop 的資源消耗比 htop 略高 在嵌入式系統或極低效能環境中,建議仍使用 top 或 htop ------------------------- 除錯流程建議 (維運篇) ------------------------- 當系統異常時,建議依序排查: 1. 快速檢視整體狀況 htop 或 top,按 1 查看各核心使用率 2. 找出耗用資源的進程 ps aux --sort=-%cpu | head -11 ps aux --sort=-%mem | head -11 在 htop 中可按 F6 排序,或按 P (CPU)、M (記憶體) 3. 深入分析特定進程 完整進程資訊 ps -fp PID 查看執行檔路徑 (確認是哪個程式) ls -l /proc/PID/exe 查看開啟的檔案 (找出可能的 I/O 來源) ls -l /proc/PID/fd 查看環境變數 (確認配置是否正確) cat /proc/PID/environ | tr '\0' '\n' 查看執行緒數量 ps -L -p PID | wc -l 4. 檢查服務狀態 查看服務狀態 (含最近日誌) systemctl status nginx 即時查看服務日誌 journalctl -u nginx -f 查看服務最近 50 行日誌 journalctl -u nginx -n 50 5. 檢查系統日誌 系統日誌 tail -f /var/log/syslog 核心訊息 (驅動程式錯誤、OOM killer 等) dmesg | tail -20 含時間戳的錯誤訊息 dmesg -T | grep -i error 6. 決定處理方式 正常但資源過高:調整參數或重啟服務 異常來源不明:先記錄再終止,並找出根源 疑似惡意程式:隔離網路後分析,必要時重建系統 ------------------ 常見問題與排解 ------------------ Q1: CPU滿載但找不到高CPU進程 可能原因: Kernel thread (核心執行緒) I/O wait (I/O 等待) 中斷處理 (IRQ) 隱藏程序 (rootkit) 檢查方法: 在 top 中按 1 查看各核心使用率,觀察 wa 值是否過高 (I/O 等待問題) top 查看 I/O 統計 (需安裝 iotop) apt install iotop iotop -o 查看中斷分佈 cat /proc/interrupts 查看核心執行緒,以方括號表示 ps aux | grep '\[' 使用 perf 分析 CPU 熱點 apt install linux-perf perf top Q2: 記憶體不足但找不到高記憶體進程 可能原因: 快取佔用 (正常現象) 核心記憶體洩漏 共享記憶體未釋放 檢查方法: 查看記憶體詳細資訊 free -h cat /proc/meminfo 查看核心資料結構記憶體 slabtop 查看共享記憶體 ipcs -m 查看 OOM 紀錄 journalctl -k | grep -i 'oom\|killed' 注意:free -h 中的 available 才是真正可用記憶體,free 欄位小不代表記憶體不足。Linux 會積極使用空閒記憶體作為快取 Q3: 殭屍進程過多 可能原因: 父進程未正確回收子進程(wait() 呼叫缺失) 程式設計錯誤 檢查與處理: 找出殭屍進程 ps aux | awk '$8=="Z"' 查看父進程 ps -fp PPID 嘗試重啟父進程 systemctl restart 服務名稱 注意:少量殭屍(1~2 個)為暫時現象,大量才需處理。殭屍僅佔用 PID,不佔 CPU/記憶體,只有當 PID 耗盡時才會影響系統。若無法清除,最後手段是重開機 Q4: 無法終止進程 可能原因: 程序處於不可中斷睡眠狀態(D state) 權限不足 核心執行緒 解決方法: 確認進程狀態 ps aux | grep PID 依序嘗試 正常終止 kill -15 PID sleep 5 強制終止 kill -9 PID 警告:D 狀態進程無法被任何訊號終止,因為它正在等待核心 I/O 操作完成。這通常是 NFS 掛載失去連線、磁碟錯誤或驅動程式問題造成的,需要解決底層問題才能恢復 Q5: 使用 top/htop 時CPU百分比超過100% 這是多核心系統的正常現象。%CPU 欄位顯示的是「使用的 CPU 核心數的百分比」,在 4 核心系統中,單一進程最大可顯示 400% 在 top 中按 1 可切換為顯示各核心個別使用率 htop 預設即顯示各核心的條狀圖 ----------------------- 安全與最佳實務建議 ----------------------- 日常維運建議 1.安裝必要的監控工具 apt install htop lsof iotop btop 2.設定每日自動進程報告(cron) 編輯 crontab crontab -e 加入以下行(每天早上 9 點發送報告) 0 9 * * * ps aux --sort=-%cpu | head -20 | mail -s "Daily Process Report" admin@example.com 3.設定使用者進程數量限制(防止 fork bomb) # /etc/security/limits.conf username soft nproc 100 username hard nproc 200 ------------------ 安全注意事項 ------------------ 1.不要隨意終止系統進程:特別是 systemd、kthreadd、kworker 等核心執行緒 2.生產環境操作原則:先確認,再行動;優先使用 systemctl 管理服務;必要時先備份設定檔;記錄操作步驟 3.權限管理:避免以 root 執行不明程序;定期檢查異常權限的程序(SUID 位元);使用 sudo 限制權限 4.定期檢查:使用 ps aux 或 top 定期檢視有無不明進程;注意名稱偽裝的惡意進程 (如偽裝成系統服務) ----------------- 效能優化建議 ----------------- 1.調整 Nice 值 (影響CPU排程優先級) 降低背景任務優先級 (正值 = 低優先) renice +10 -p PID 提高重要服務優先級 (需 root,負值 = 高優先) renice -5 -p PID 啟動時就設定 nice 值 nice -n 10 command 2.設定CPU親和性 (綁定程序到特定CPU核心) 將 PID 綁定到 CPU 0 和 1 taskset -c 0,1 -p PID 啟動時就綁定 taskset -c 0 command 3.使用 cgroups 限制資源 (透過 systemd) 以限制的資源啟動指令 (CPU 最多 50%,記憶體最多 1G) systemd-run --scope -p CPUQuota=50% -p MemoryMax=1G command 建議:在 Debian 13 中,systemd 已整合 cgroups v2,可以透過 systemctl set-property 命令為服務設定資源限制,這是現代Linux系統推薦的資源控制方式 ---------------------- 學習資源與延伸閱讀 ---------------------- man 手冊頁 ps 完整文件 man ps top 完整文件 man top htop 完整文件 man htop kill 訊號說明 man kill Linux訊號完整列表 man signal /proc 虛擬檔案系統說明 man proc 系統文件 /usr/share/doc/ 目錄下各工具的完整說明文件 /proc 目錄:每個子目錄對應一個進程,包含進程的所有狀態資訊 延伸工具 strace:追蹤進程的系統呼叫 (system call),適合深入除錯 ltrace:追蹤進程的函式庫呼叫 (library call) perf:Linux效能分析工具,支援CPU熱點分析、效能計數器 valgrind:記憶體洩漏與錯誤偵測工具 (主要用於開發階段) atop:類似 top 但支援記錄歷史數據,可回溯分析 進階監控系統 Prometheus + Grafana:企業級指標收集與視覺化平台 Netdata:即時效能監控,安裝簡單,介面直觀 Zabbix / Nagios:傳統企業監控解決方案,支援告警通知
Create an account or sign in to comment