面试题答案
一键面试设计思路
- 资源监控与进程数量控制:使用
ps
命令统计每个服务的进程数量,与预设的合理范围进行比较。如果进程数量不足,则启动新的进程;如果超出范围,则终止多余的进程。 - 异常退出检测与自动重启:使用
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
命令等待所有监控任务完成。