目标
以可控制的多进程执行,达到最大执行时长后停止脚本。
思路
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