首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

通用停止進程 Bash 腳本:精準控制,安全高效

     編輯:關於C語言

在 Linux/Unix 系統管理中,優雅地停止特定進程是一項基本且關鍵的技能。本文介紹一個通用的 Bash 腳本 process_stopper.sh,它能夠根據進程名或完整命令行參數,精準地停止屬於當前用戶的進程,避免誤傷其他用戶的同名進程。

腳本核心特性

  • 用戶隔離:僅停止當前用戶擁有的進程,保障多用戶環境下的操作安全。
  • 精準匹配:支援以進程名、完整命令行或部分命令行作為匹配條件,靈活定位目標進程。
  • 優雅終止機制:先發送 SIGTERM (signal 15) 讓進程釋放資源、保存狀態,等待 2 秒後若進程仍存活,再強制發送 SIGKILL (signal 9) 徹底終止。

程式碼解析

#!/bin/sh
# 來源: https://code.google.com/p/mooon

# 1. 參數檢查
if test $# -ne 1; then
  printf "\033[1;33musage: $0 process_cmdline\033[m\n"
  exit 1
fi

process_cmdline=$1          # 目標進程命令行
cur_user=$(whoami)          # 當前用戶名
uid=$(id -u "$cur_user")    # 當前用戶 UID

# 2. 取得進程名 (命令行的第一個欄位)
process_name=$(basename "$(echo "$process_cmdline" | cut -d' ' -f1)")

# 3. 獲取符合條件的 PID 列表
# ps -C 指定進程名, h 隱藏標題, -o euser,pid,args 輸出有效用戶、PID、完整命令
# awk 過濾: 用戶匹配 且 命令行包含傳入參數
pid_set=$(ps -C "$process_name" h -o euser,pid,args |
  awk -v uid="$uid" -v cur_user="$cur_user" -v cmd="$process_cmdline" '
    ($1 == uid || $1 == cur_user) && match($0, cmd) { print $2 }
  ')

# 4. 循環發送信號終止進程
for pid in $pid_set; do
  kill "$pid"      # SIGTERM
  sleep 2
  kill -9 "$pid"   # SIGKILL
done

關鍵邏輯說明

參數處理與用戶識別

腳本強制要求一個參數 process_cmdline。透過 whoami 和 id -u 獲取當前用戶身份,確保後續 ps 篩選時只鎖定屬於該用戶的進程。

進程名提取

cut -d' ' -f1 取命令行第一個空格前的內容 (可執行文件路徑),再用 basename 取得純進程名,供 ps -C 使用。

PID 篩選策略

使用 ps -C "$process_name" h -o euser,pid,args 列出該進程名下所有進程的「有效用戶、PID、完整命令行」。隨後 awk 執行兩層過濾:

  1. 用戶匹配:$1 == uid || $1 == cur_user (兼容數字 UID 與用戶名兩種輸出格式)。
  2. 命令行模糊匹配:match($0, cmd) 確保完整命令行包含用戶傳入的特徵字串,實現精準定位。

兩階段終止機制

循環中先 kill $pid (預設 SIGTERM),給予進程 2 秒緩衝時間處理善後工作 (如 flush buffer、釋放鎖);超時後 kill -9 $pid 強制回收資源。這是生產環境推薦的標準停止流程。

使用範例

# 停止名為 my_server 的進程
./process_stopper.sh my_server

# 停止帶特定參數的 java 進程
./process_stopper.sh "java -jar app.jar --port=8080"

注意事項

  • 腳本需具備執行權限:chmod +x process_stopper.sh。
  • 若目標進程數量極大,循環發送信號可能耗時;可考慮將 kill 改為批次處理 (如 kill $pid_set),但失去逐個等待 2 秒的優雅特性。
  • 來源專案:mooon,作者博客:飛月。

這個腳本體積小巧、邏輯清晰,是系統管理員和開發人員工具箱中實用的「瑞士軍刀」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved