程序管理
Linux 程序管理與監控
Process vs Thread
Process (程序)
- 程式的執行實例
- 擁有獨立的記憶體空間
- 包含程式碼、資料、堆疊等
- 由作業系統管理
Thread (執行緒)
- 程序內的執行單位
- 共享程序的記憶體空間
- 更輕量,切換成本低
- 可並行執行
Process
├── Memory Space (獨立記憶體空間)
├── Thread 1
├── Thread 2
└── Thread 3Process States
程序在生命週期中會經歷不同的狀態:
Running (R)
- 正在執行或等待執行
- 在 CPU 上運行
Sleeping (S / D)
- S (Interruptible Sleep) - 可中斷的睡眠
- 等待事件完成 (如 I/O)
- 可被訊號喚醒
- D (Uninterruptible Sleep) - 不可中斷的睡眠
- 通常是等待 I/O
- 無法被訊號中斷
Stopped (T)
- 程序被停止
- 通常由 Ctrl+Z 或 SIGSTOP 訊號造成
- 可用
fg或bg恢復
Zombie (Z)
- 程序已結束但未被清理
- 佔用程序表項目
- 等待父程序讀取結束狀態
Zombie Process (殭屍程序)
什麼是 Zombie Process?
當子程序結束時,會進入 zombie 狀態,直到父程序呼叫 wait() 或 waitpid() 讀取其結束狀態。
問題:
- 佔用 PID
- 大量 zombie 會耗盡 PID 資源
- 無法用
kill清除
識別 Zombie Process
# 查看 zombie 程序
ps aux | grep 'Z'
# 統計 zombie 數量
ps aux | awk '{if($8=="Z") print}' | wc -l
# 找出 zombie 的父程序
ps -ef | grep defunct清除 Zombie Process
# 方法 1: 終止父程序
kill -9 <parent_pid>
# 方法 2: 向父程序發送 SIGCHLD
kill -s SIGCHLD <parent_pid>
# 方法 3: 重啟系統服務
systemctl restart service_nameDaemon Process (守護程序)
特性
- 在背景執行
- 沒有控制終端機
- 通常由 init (PID 1) 作為父程序
- 提供系統服務
常見 Daemon
sshd- SSH 服務httpd/nginx- Web 伺服器cron- 排程服務systemd- 系統初始化
建立 Daemon
# 使用 nohup 在背景執行
nohup command &
# 使用 screen 或 tmux
screen -dmS session_name command
# 使用 systemd 服務
systemctl start service_nameTimeslice (時間片)
什麼是 Timeslice?
作業系統分配給每個程序的 CPU 執行時間片段。
- 典型值: 幾毫秒到幾十毫秒
- Linux CFS (Completely Fair Scheduler) 動態調整
- 高優先級程序獲得更多時間片
查看排程資訊
# 查看程序優先級
ps -el
# 欄位說明
# NI - Nice value (-20 to 19)
# PRI - Priority (0-139, 數字越小優先級越高)Process Priority
Nice Value
- 範圍: -20 (最高優先級) 到 19 (最低優先級)
- 預設值: 0
- 影響 CPU 時間分配
設定 Priority
# 啟動時設定 nice value
nice -n 10 command
# 調整執行中程序的 nice value
renice 10 -p <pid>
# 以高優先級執行 (需要 root)
nice -n -10 command
sudo renice -10 -p <pid>Signals (訊號)
常用訊號
| 訊號 | 數字 | 說明 | 預設動作 |
|---|---|---|---|
| SIGHUP | 1 | 終端掛斷 | 終止 |
| SIGINT | 2 | 鍵盤中斷 (Ctrl+C) | 終止 |
| SIGQUIT | 3 | 鍵盤退出 (Ctrl+\) | 終止+Core Dump |
| SIGKILL | 9 | 強制終止 | 無條件終止 |
| SIGTERM | 15 | 終止請求 | 優雅終止 |
| SIGSTOP | 19 | 停止程序 | 停止 |
| SIGCONT | 18 | 繼續執行 | 繼續 |
| SIGCHLD | 17 | 子程序狀態改變 | 忽略 |
發送訊號
# 優雅終止 (預設 SIGTERM)
kill <pid>
# 強制終止
kill -9 <pid>
kill -KILL <pid>
# 重新載入設定
kill -HUP <pid>
# 終止所有同名程序
killall process_name
# 按名稱搜尋並終止
pkill process_nameProcess Information
/proc 檔案系統
# 查看程序資訊
cat /proc/<pid>/status # 程序狀態
cat /proc/<pid>/cmdline # 啟動命令
cat /proc/<pid>/environ # 環境變數
cat /proc/<pid>/fd/ # 開啟的檔案描述符
cat /proc/<pid>/limits # 資源限制
# 系統資訊
cat /proc/cpuinfo # CPU 資訊
cat /proc/meminfo # 記憶體資訊
cat /proc/loadavg # 系統負載systemd Service Management
服務管理
# 啟動服務
systemctl start service_name
# 停止服務
systemctl stop service_name
# 重啟服務
systemctl restart service_name
# 重新載入設定
systemctl reload service_name
# 查看狀態
systemctl status service_name開機自動啟動
# 啟用開機自動啟動
systemctl enable service_name
# 停用開機自動啟動
systemctl disable service_name
# 查看是否啟用
systemctl is-enabled service_name查看服務
# 列出所有服務
systemctl list-units --type=service
# 列出啟用的服務
systemctl list-unit-files --type=service --state=enabled
# 查看失敗的服務
systemctl --failedProcess Monitoring
即時監控
# top - 傳統程序監控
top
# htop - 互動式監控 (需安裝)
htop
# 常用快捷鍵
# P - 按 CPU 排序
# M - 按記憶體排序
# k - 終止程序
# q - 退出程序列表
# 列出所有程序
ps aux
# 樹狀顯示
ps auxf
pstree
# 特定使用者的程序
ps -u username
# 搜尋程序
pgrep -l process_name