[shell]bash-parallel

5 篇文章 0 订阅

tcsh是不支持函数的,记住记住.

就像在linux的terminal下命令的时候可以在最后加一个&,表示让它在后台跑(可以 用top命令查看后台的进程都有啥, use “q”+ process ID to terminate it.)

command1 $1 $2 &
command2 $2 $3 &
wait
exit -1

记得在最后加上个wait就是指这两个命令都跑完了再退出.
这种好像是一个cpu去跑一个command, 但是如果这种后台运行的command太多,大于cpu数,就不行了.

网上有人写了函数,用先进先出的队列去把进程ID号存进去.
这样设队列的长度为cpu数,队列满了就先不跑,有执行完的就队列pop出来一个.
http://jerkwin.github.io/2013/12/14/Bash%E8%84%9A%E6%9C%AC%E5%AE%9E%E7%8E%B0%E6%89%B9%E9%87%8F%E4%BD%9C%E4%B8%9A%E5%B9%B6%E8%A1%8C%E5%8C%96/

#!/bin/bash
Njob=10    # 作业数目
Nproc=5    # 可同时运行的最大作业数

function CMD {        # 测试命令, 随机等待几秒钟
    n=$((RANDOM % 5 + 1))
    echo "Job $1 Ijob $2 sleeping for $n seconds ..."
    sleep $n
    echo "Job $1 Ijob $2 exiting ..."
}
function PushQue {    # 将PID压入队列
    Que="$Que $1"
    Nrun=$(($Nrun+1))
}
function GenQue {     # 更新队列
    OldQue=$Que
    Que=""; Nrun=0
    for PID in $OldQue; do
        if [[ -d /proc/$PID ]]; then
            PushQue $PID
        fi
    done
}
function ChkQue {     # 检查队列
    OldQue=$Que
    for PID in $OldQue; do
        if [[ ! -d /proc/$PID ]] ; then
            GenQue; break
        fi
    done
}

for((i=1; i<=$Njob; i++)); do
    CMD $i &
    PID=$!
    PushQue $PID
    while [[ $Nrun -ge $Nproc ]]; do
        ChkQue
        sleep 1
    done
done
wait

这篇文章的作者还提到了用数组记录PID,

# Language: bash
Njob=10    # 作业数目
Nproc=5    # 可同时运行的最大作业数

function CMD {        # 测试命令, 随机等待几秒钟
    n=$((RANDOM % 5 + 1))
    echo "Job $1 Ijob $2 sleeping for $n seconds ..."
    sleep $n
    echo "Job $1 Ijob $2 exiting ..."
}

PID=() # 记录PID到数组, 检查PID是否存在以确定是否运行完毕
for((i=1; i<=Njob; )); do
    for((Ijob=0; Ijob<Nproc; Ijob++)); do
        if [[ $i -gt $Njob ]]; then
            break;
        fi
        if [[ ! "${PID[Ijob]}" ]] || ! kill -0 ${PID[Ijob]} 2> /dev/null; then
            CMD $i $Ijob &
            PID[Ijob]=$!
            i=$((i+1))
        fi
    done
    sleep 1
done
wait

不知道我代码看得对不对,但是这个有些奇怪.
照我的理解,这个程序
i=1: Ijob=0,1,2,3,4(一次执行了5个后台程序),于是数组PID[]就一次存了这五个的进程ID.
i=2: Ijob为0的要去看PID[0]对应的进程执行完了没有, Ijob为1的要去看PID[1]对应的进程执行完了没有, Ijob为2的要去看PID[2]对应的进程执行完了没有, Ijob为3的要去看PID[3]对应的进程执行完了没有, Ijob为4的要去看PID[4]对应的进程执行完了没有.
也就是说,假设在i=1的时候,Ijob为4的那个进程一直没有跑完, 那么i=2时Ijob=4的那个程序就一直没法跑. 哪怕数组的其他四个位置空出来(进程执行完了)也没用.
是这样吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值