修復項目中常駐進程異常退出問題

一.問題與思考

項目中使用IM中間件rabbitMQ,存在常駐進程異常退出,需要自動監測項目中所有的worker正常運行(異常退出worker監測與拉起).

二.流程處理

  1. 建立項目worker配置文件
  2. linux定時檢測worker狀態
    1. 當前worker狀態獲取
    2. 對於實際worker數據與配置不符合的,重置該業務worker進程數量

三.主要代碼實現

  • 項目worker配置
[common_test]
cmd = common/test/index
test_procs = 2
prod_procs = 5

[msg_test]
cmd = msg/test/index
test_procs = 2
prod_procs = 5
  • 當前worker狀態獲取及配置worker數量信息
<?php
/**
 * Created by PhpStorm.
 * User: 小小徐
 * Date: 2019/8/25
 * Time: 16:38
 */
$arr = parse_ini_file(__DIR__.'/../daemon2.ini',true);
if(getenv('APP_ENV') != 'prod'){
    $needNumKey = "test_procs";
}else{
    $needNumKey = "prod_procs";
}
foreach ($arr as $key=>$value)
{
    $cmd = $value['cmd'];
    $execNum = exec("ps aux|grep -v grep|grep $cmd|wc -l");
    echo $key.'  '.$cmd.'  '.$execNum.'/'.$value[$needNumKey].PHP_EOL;
}
  • 檢測當前worker數量是否和配置數量一致,不一致時修復worker進程
#!/bin/bash
executePath=$(readlink -f $(dirname $0))
executeLog=`readlink -f  $executePath/check.log`
envPath=`readlink -f  $executePath/../../env.sh`
source $envPath
set -a; source /etc/environment; set +a;
scriptIndex=`readlink -f  $executePath/../console/index.php`
proStatusSaveFile="/var/www/html/proStatus.log"
proExecFile=`readlink -f  $executePath/parseIni.php`
proccessName=
#declare -i proccessNum
#declare -i needNum
proccessNum=0
needNum=0
function setProccessNum
{
    proccessNum=`ps aux|grep -v grep|grep $proccessName|wc -l`
}

function stop_pro()
{
    setProccessNum
    pids=$(ps aux|grep -v grep|grep ${proccessName}|awk '{ print $2 }')
    for pid in $pids
    do
        setProccessNum
        if [ $proccessNum -eq $needNum ]
        then
            break
        fi
        kill -9 $pid
    done
}

function start_pro()
{
    setProccessNum
    while (( $proccessNum < $needNum ))
    do
        /usr/local/php/bin/php $scriptIndex $proccessName   &
        setProccessNum
    done
}

function reset()
{
    if [ $proccessNum -lt $needNum ]
    then
        echo  "實際進程數爲:"$proccessNum"需要進程數爲:"$needNum"增加進程數..."
        start_pro
    elif [ $proccessNum -gt $needNum ]
    then
        echo "實際進程數爲:"$proccessNum"需要進程數爲:"$needNum"減少進程數..."
        stop_pro
        sleep 1
        start_pro
    fi
}

function checkType(){
    local a="$1"
    printf "%d" "$a" &>/dev/null && echo "integer" && return
    printf "%d" "$(echo $a|sed 's/^[+-]\?0\+//')" &>/dev/null && echo "integer" && return
    printf "%f" "$a" &>/dev/null && echo "number" && return
    [ ${#a} -eq 1 ] && echo "char" && return
    echo "string"
}

function proccessInit()
{
    proccessName=$2
    arr=($(echo $3 | awk 'BEGIN{FS="/";OFS=" "} {print strtonum($1),strtonum($2)}'))
    proccessNum=${arr[0]}
    needNum=${arr[1]}
    setProccessNum
}
php $proExecFile > $proStatusSaveFile
while read line
do
    proccessInit $line
    reset
done  < $proStatusSaveFile

四.遇到的問題與實現

php在計算的時候會自動將字符串類型的變量轉化爲數值類型,shell使用字符串實現運算時(判斷大於小於)會報錯!通過百度通過awk與strtonum解決該問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章