zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    网页请求过滤器Filter
    高级查询
    SQL编程
    数据库的实现
    数据库设计
    使用ADO.NET查询和操作数据
    使用ADO.NET访问数据库
    深入C#中的String类
    使用属性升级MyBank
    C#语法快速热身
  • 原文地址:https://www.cnblogs.com/imzye/p/7257318.html
Copyright © 2011-2022 走看看