程序管理

Linux 程序管理與監控

Process vs Thread

Process (程序)

  • 程式的執行實例
  • 擁有獨立的記憶體空間
  • 包含程式碼、資料、堆疊等
  • 由作業系統管理

Thread (執行緒)

  • 程序內的執行單位
  • 共享程序的記憶體空間
  • 更輕量,切換成本低
  • 可並行執行
Process
├── Memory Space (獨立記憶體空間)
├── Thread 1
├── Thread 2
└── Thread 3

Process States

程序在生命週期中會經歷不同的狀態:

Running (R)

  • 正在執行或等待執行
  • 在 CPU 上運行

Sleeping (S / D)

  • S (Interruptible Sleep) - 可中斷的睡眠
    • 等待事件完成 (如 I/O)
    • 可被訊號喚醒
  • D (Uninterruptible Sleep) - 不可中斷的睡眠
    • 通常是等待 I/O
    • 無法被訊號中斷

Stopped (T)

  • 程序被停止
  • 通常由 Ctrl+Z 或 SIGSTOP 訊號造成
  • 可用 fgbg 恢復

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_name

Daemon 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_name

Timeslice (時間片)

什麼是 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 (訊號)

常用訊號

訊號數字說明預設動作
SIGHUP1終端掛斷終止
SIGINT2鍵盤中斷 (Ctrl+C)終止
SIGQUIT3鍵盤退出 (Ctrl+\)終止+Core Dump
SIGKILL9強制終止無條件終止
SIGTERM15終止請求優雅終止
SIGSTOP19停止程序停止
SIGCONT18繼續執行繼續
SIGCHLD17子程序狀態改變忽略

發送訊號

# 優雅終止 (預設 SIGTERM)
kill <pid>

# 強制終止
kill -9 <pid>
kill -KILL <pid>

# 重新載入設定
kill -HUP <pid>

# 終止所有同名程序
killall process_name

# 按名稱搜尋並終止
pkill process_name

Process 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 --failed

Process Monitoring

即時監控

# top - 傳統程序監控
top

# htop - 互動式監控 (需安裝)
htop

# 常用快捷鍵
# P - 按 CPU 排序
# M - 按記憶體排序
# k - 終止程序
# q - 退出

程序列表

# 列出所有程序
ps aux

# 樹狀顯示
ps auxf
pstree

# 特定使用者的程序
ps -u username

# 搜尋程序
pgrep -l process_name