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

通用進程監控重啟腳本:單實例互斥、參數級隔離、用戶級隔離的生產級方案

     編輯:關於C語言

核心特性

  • 單實例互斥:同一腳本同一參數僅允許一個監控進程,防止重複啟動
  • 參數級隔離:互斥鍵包含完整命令列,不同參數視為不同任務
  • 用戶級隔離:僅檢測當前用戶擁有的進程,多用戶環境互不干擾
  • 靈活匹配:被監控進程可指定完整命令列或部分關鍵字
  • 自動重啟:進程消失自動呼叫重啟腳本拉起

使用方式

# 監控 "nginx -c /etc/nginx.conf",重啟腳本為 restart_nginx.sh
./process_monitor.sh "nginx -c /etc/nginx.conf" ./restart_nginx.sh

關鍵實作邏輯

1. 互斥檢測

self_count=$(ps -C $self_name -o euser,args | awk -v uid=$uid -v cur_user=$cur_user -v cmd="$self_cmdline" '
    BEGIN {num=0}
    ($1==uid || $1==cur_user) && index($0, cmd) {++num}
    END {print num}')

self_count > 2 視為已有實例運行(含當前 grep 進程),直接退出。

2. 目標進程檢測與重啟

process_count=$(ps -C $process_name -o euser,args | awk -v uid=$uid -v cur_user=$cur_user -v cmd="$process_cmdline" '
    BEGIN {num=0}
    ($1==uid || $1==cur_user) && index($0, cmd) {++num}
    END {print num}')

if [ $process_count -lt 1 ]; then
    echo "restart \"$process_cmdline\""
    sh -c "$restart_script"  # 必須用 sh -c 執行支援複雜命令列
fi

部署建議

  • 放入 /etc/init.d/ 或 systemd 服務實現開機自啟
  • 重啟腳本需處理 PID 檔、資源限制、環境變數等
  • 高可用場景建議搭配 heartbeat/corosync 而非單機腳本

注意事項

  • 需 ps 支援 -C 選項(procps-ng)
  • 進程名取命令列第一欄,參數含空格時需用引號包裹
  • 重啟腳本必須有執行權限且能在前景正確啟動目標
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved