80 lines
2.0 KiB
Bash
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
|
|
# 测试结束
|
|
|