MST

星途 面试题库

面试题:Bash进程管理在复杂系统架构中的优化与应用

在一个基于Bash脚本实现的分布式系统部署脚本中,会启动大量进程用于不同服务。由于资源有限,需确保每个服务的进程数量在合理范围内,并且当某个服务进程异常退出时,要能自动重启该服务进程。请设计一个Bash脚本框架来实现这些需求,阐述你的设计思路并给出关键代码片段。
49.7万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 资源监控与进程数量控制:使用 ps 命令统计每个服务的进程数量,与预设的合理范围进行比较。如果进程数量不足,则启动新的进程;如果超出范围,则终止多余的进程。
  2. 异常退出检测与自动重启:使用 while true 循环结合 sleep 定期检查进程状态。若进程异常退出(通过 ps 命令无法找到对应的进程),则重新启动该服务进程。

关键代码片段

#!/bin/bash

# 服务名称及对应的合理进程数量范围和启动命令
declare -A service_config=(
    ["service1"]="2:5:/path/to/service1/start.sh"
    ["service2"]="1:3:/path/to/service2/start.sh"
)

monitor_service() {
    local service=$1
    local min_count=$(echo ${service_config[$service]} | cut -d':' -f1)
    local max_count=$(echo ${service_config[$service]} | cut -d':' -f2)
    local start_command=$(echo ${service_config[$service]} | cut -d':' -f3)

    while true; do
        local current_count=$(ps -ef | grep -w $service | grep -v grep | wc -l)

        if [ $current_count -lt $min_count ]; then
            local diff=$((min_count - current_count))
            for ((i = 0; i < diff; i++)); do
                $start_command &
            done
        elif [ $current_count -gt $max_count ]; then
            local diff=$((current_count - max_count))
            local pids=$(ps -ef | grep -w $service | grep -v grep | awk '{print $2}' | head -n $diff)
            for pid in $pids; do
                kill -9 $pid
            done
        fi

        sleep 5
    done
}

for service in ${!service_config[@]}; do
    monitor_service $service &
done

wait

此脚本通过定义一个关联数组 service_config 来存储每个服务的相关配置(最小进程数、最大进程数和启动命令)。monitor_service 函数负责监控每个服务的进程数量,并根据需要启动或终止进程。最后,通过循环为每个服务启动监控任务,并使用 wait 命令等待所有监控任务完成。