#!/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 # 测试结束