核心概念:程序 vs 進程
- 程序:靜態的可執行文件(如
/usr/sbin/httpd、/bin/bash),佔用磁碟空間。
- 進程:程序的動態執行實例,擁有獨立的虛擬地址空間、PID、資源描述符、安全上下文。一個程序可啟動多個進程(如 Apache Prefork MPM)。
進程分類
| 類型 | 特徵 | 典型例子 |
| 交互進程 | 終端啟動、需用戶輸入、前台運行 | bash、vim、top、mysql client |
| 批處理進程 | 非交互、排隊執行、通常腳本/定時任務 | cron job、backup script、編譯構建 |
| 守護進程 | 後台長期運行、無控制終端、系統啟動自動拉起 | systemd、sshd、httpd、mysqld、crond |
進程關鍵屬性(ps 輸出欄位)
| 屬性 | 含義 | 查看命令 |
| PID | 進程 ID,唯一標識 | ps -eo pid |
| PPID | 父進程 ID | ps -eo ppid |
| UID/EUID | 真實/有效用戶 ID(權限依據) | ps -eo uid,euid |
| GID/EGID | 真實/有效組 ID | ps -eo gid,egid |
| STAT | 狀態:R(運行)、S(可中斷睡眠)、D(不可中斷睡眠/IO)、Z(殭屍)、T(停止)、<(高優先級)、N(低優先級)、l(多線程)、+(前台組) | ps -eo stat |
| NI | Nice 值(-20~19,越小優先級越高) | ps -eo ni |
| PRI | 內核調度優先級(實時優先級 0-99,普通 100-139) | ps -eo pri |
| %CPU | CPU 使用率(採樣週期內佔用) | ps -eo pcpu |
| %MEM | 物理記憶體佔用率 | ps -eo pmem |
| VSZ | 虛擬記憶體大小 (KB) | ps -eo vsz |
| RSS | 常駐集大小 (KB),實際物理記憶體佔用 | ps -eo rss |
| TTY | 控制終端(? 表示無) | ps -eo tty |
| COMMAND | 啟動命令及參數 | ps -eo cmd |
ps 實戰:最常用組合
# 全量詳盡(標準輸出)
ps -eo pid,ppid,user,group,pcpu,pmem,vsz,rss,stat,ni,pri,tty,time,cmd --sort=-pcpu | head -20
# 樹狀顯示父子關係
ps -ef --forest | grep nginx
ps auxf | grep httpd
# 按用戶過濾
ps -u www-data -o pid,pcpu,pmem,cmd
# 線程級視圖(LWP = 線程 ID)
ps -eLf | grep java
ps -T -p # 查看指定進程所有線程
pgrep / pkill:按名稱查找/殺死進程
| 命令 | 用途 | 常用參數 | 範例 |
| pgrep | 查詢 PID | -l 顯示名稱、-f 匹配完整命令行、-u 指定用戶、-P 父 PID、-o/-n 最老/最新 | pgrep -lf nginx
pgrep -u www -f php-fpm |
| pkill | 發送信號殺死 | 參數同 pgrep、-SIGNAL 指定信號(預設 TERM) | pkill -9 -f "java.*myapp"
pkill -HUP nginx |
| killall | 按進程名殺死所有 | -u 用戶、-r 正則、-w 等待結束 | killall -u www php-fpm |
kill 信號大全:優雅關閉 vs 強制終止
| 信號 | 數值 | 行為 | 典型用途 | 可捕獲/阻塞/忽略 |
SIGHUP | 1 | 掛起/重載配置 | Nginx/Apache 熱重載、終端斷開通知 | 可捕獲 |
SIGINT | 2 | 中斷 | Ctrl+C、前台程序優雅退出 | 可捕獲 |
SIGQUIT | 3 | 退出並 Core Dump | Ctrl+\、調試生成 core 文件 | 可捕獲 |
SIGKILL | 9 | 強制終止(內核直接回收) | 僵屍進程、失控進程、最後手段 | 不可捕獲/阻塞/忽略 |
SIGTERM | 15 | 優雅終止(預設) | systemctl stop、服務管理標準信號 | 可捕獲 |
SIGUSR1/2 | 10/12 | 用戶自定義 | Nginx 重開日誌 (USR1)、平滑升級 (USR2) | 可捕獲 |
SIGCHLD | 17 | 子進程結束通知父進程 | 父進程 wait() 回收僵屍 | 可捕獲 |
SIGSTOP | 19 | 暫停執行 | Ctrl+Z、調試凍結進程 | 不可捕獲/阻塞/忽略 |
SIGCONT | 18 | 繼續執行 | fg/bg 恢復暫停進程 | 可捕獲 |
top / htop / glances:動態監控
top 關鍵交互鍵
| 鍵 | 功能 |
M | 按記憶體佔用排序(佔用大→小) |
P | 按 CPU 佔用排序(預設) |
T | 按累積 CPU 時間排序 |
N | 按 PID 排序 |
c | 切換顯示完整命令行 |
k | 殺死進程(輸入 PID + 信號) |
r | 重設 Nice 值(輸入 PID + 新值) |
d | 修改刷新間隔(秒) |
1 | 切換顯示所有 CPU 核心佔用 |
h | 幫助 |
q | 退出 |
htop:彩色、滾動、滑鼠支援、樹狀視圖、更直觀。
glances:Python 寫、跨平台、Web 模式、REST API、容器/GPU/磁碟/網路全維度。
進程優先級:nice 與 renice
# 啟動時指定 nice 值(-20 最高,19 最低,預設 0)
nice -n -5 ./my_high_priority_task & # 需 root 權限設負值
nice -n 10 ./my_low_priority_task & # 普通用戶只能增大 nice
# 調整運行中進程優先級
renice -n -10 -p 12345 # 提高優先級(需 root)
renice -n 5 -p 12345 # 降低優先級
# top 中按 r 鍵互動式 renice
現代替代:systemd-run --scope -p CPUWeight=200 ./task(cgroups v2 CPU 權重)、cpulimit -l 50 -p 12345(限制 CPU 使用率百分比)。
systemd 服務管理(現代標準)
| 操作 | 命令 | 說明 |
| 啟動/停止/重啟 | systemctl start|stop|restart nginx | 替代 service |
| 啟用/禁用開機自啟 | systemctl enable|disable nginx | 替代 chkconfig |
| 查看狀態/日誌 | systemctl status nginx
journalctl -u nginx -f | 含 PID、CGroup、最近日誌 |
| 重載配置 | systemctl reload nginx | 發送 SIGHUP |
| 查看依賴樹 | systemctl list-dependencies nginx | 啟動順序分析 |
| 編輯單元檔 | systemctl edit nginx | 生成 drop-in 覆蓋,不修改原檔 |
常見故障排查清單
- 高 CPU:
top -Hp 定位熱線程 → perf top -p 定位熱函數 → gdb -p 打斷點/回溯。
- 高記憶體:
pmap -x 看映射區域 → cat /proc//smaps | grep -A 20 "Heap\|Stack\|anon" → valgrind --tool=massif 或 heaptrack 剖析。
- 僵屍進程:
ps -eo stat,ppid,pid,cmd | grep ^Z 找父進程 → 修復父進程 wait() 或重啟父進程。
- D 狀態不可中斷睡眠:通常為磁碟 IO 等待 →
iostat -x 1、iotop 定位磁碟壓力 → 檢查 NFS/雲盤掛載、磁碟故障。
- FD 洩漏:
lsof -p | wc -l → ls -l /proc//fd/ 找未關閉文件/套接字 → 代碼審查 close()/fclose() 缺失。
總結
Linux 進程管理的核心技能鏈:ps 靜態快照 → top/htop 動態觀測 → pgrep/pkill/kill 精準控制 → nice/renice/cgroups 優先級治理 → systemd 服務生命週期管理 → 故障現象定位到代碼行。熟練掌握這套工具鏈,配合 /proc 文件系統深度洞察,是 Linux 運維與後端開發的基本功。