Linux bash并发之带有时间控制的多进程bash

目标

以可控制的多进程执行,达到最大执行时长后停止脚本。

思路

1、产生fifo管道,并预填充n个值(与并发数相等)

2、记录脚本本身PID并启动计时器进程(计时终止后杀脚本本身PID)

3、并发执行

4、正常执行后,杀掉计时器子进程

5、回收fd

控制参数

PROC: 进程数

MAX_EXEC_TIME: 最大执行时长

不带时间控制版本

#!/bin/bash

trap "exec 10>&-;exec 10<&-;exit 0" 2
mkfifo testfifo
exec 10<>testfifo
rm -f testfifo

for x in {1..10};do
  echo >&10
done

for x in {001..060};do
  read -u10
{
  ### do something
  echo "success:$x"
  sleep 2
  echo >&10
}&
done

wait 

exec 10>&-
exec 10<&-

带时间控制版本

#!/bin/bash
## create fd
[[ -e ./fd1 ]] || mkfifo ./fd1
exec 6<> ./fd1
rm -rf ./fd1

PROC=4

for i in `seq 1 ${PROC}`;
do
    echo >&6
done

## Define max execuate time here
MAX_EXEC_TIME=50

## echo $$ > PPID
ppid=$(echo $$)

## time tic-toc
{
    sleep ${MAX_EXEC_TIME} && exec 6<&- && exec 6>&- && echo "ABORT" && kill $ppid
}&
## echo $! > PID
pid=`echo $!`
################
## task list
for line in `seq 1 10`;
do
    read -u6
    {
        ## do something here
        echo "start_task_${line}: $!"
        sleep 3
        echo >&6
    }&
done
sleep 1
kill $pid
wait

## close fd read & write
exec 6<&-
exec 6>&-

echo "NORMAL EXIT" && exit 0
原文地址:https://www.cnblogs.com/imzye/p/7257318.html