first commit
This commit is contained in:
79
shell数组实现进程池.sh
Normal file
79
shell数组实现进程池.sh
Normal file
@@ -0,0 +1,79 @@
|
||||
#!/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
|
||||
# 测试结束
|
||||
|
||||
Reference in New Issue
Block a user