fragment/shell数组实现进程池.sh
2021-08-29 00:02:47 +08:00

80 lines
2.0 KiB
Bash

#!/bin/bash
#=========================================
# Filename : process_pool.sh
# Author : Colben
# Create : 2018-06-16 11:56
#=========================================
#set -euo pipefail
export LANG=en_US.UTF-8
#[ 0 = $UID ] || exit 1
mkdir -p /tmp/agent/results || exit 1
cd /tmp/agent && rm -f results/* || exit 1
# 进程池容量
readonly POOL_SIZE=4
# 进程池数组,存储子进程 pid
POOL=()
# 功能: 显示执行结果
function ShowResult {
local status=
cd results
for task in $(ls); do
status=$(sed -n '$p' $task)
if [ 0 -eq $status ]; then
echo -en "$task > \033[32;1mNORMAL\033[0m > "
else
echo -en "$task > \033[31;1mERROR\033[0m > "
fi
sed -n -e '$d' -e '1,$p' $task | tr '\n' ' '
echo -e "\033[0m"
done
}
# 功能: 执行一个任务
# 根据业务需求自己实现
function ExecTask {
# for 循环模拟一次任务
for n in $(seq 1 $1); do
echo 'a'
sleep 1
done &>> results/$1 #记录输出结果
# 记录命令返回码
echo $? >> results/$1
}
# 功能: 检查进程池状
# 参数: 一个非负整数
# 参数为 0 时检查进程池是否为空
# 参数为正整数是检查进程池是否已满
function CheckPool {
while :; do
clear
for pid in ${!POOL[@]}; do
if [ -d /proc/$pid ]; then
echo "Handling ${POOL[$pid]} ..."
else
#echo "Finished ${POOL[$pid]}"
unset POOL[$pid]
fi
done
if [ 0 -eq $1 ]; then
[ 0 -eq ${#POOL[@]} ] && break
else
[ $POOL_SIZE -gt ${#POOL[@]} ] && break
fi
sleep 0.5
done
}
# 测试开始
for task in $(seq 11 18); do # 这里的多任务用几个整数模拟
CheckPool $POOL_SIZE # 检查进程池是否已满
ExecTask $task & # 后台启动任务
POOL[$!]="$task" # 记录任务 pid 到进程池
done
CheckPool 0 # 检查进程池是否已空
ShowResult
# 测试结束