[shell]bash-parallel

来源:互联网 发布:阿里巴巴农村淘宝网址 编辑:程序博客网 时间:2024/05/18 01:12

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

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

command1 $1 $2 &command2 $2 $3 &waitexit -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/bashNjob=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    donedonewait

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

# Language: bashNjob=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 1donewait

不知道我代码看得对不对,但是这个有些奇怪.
照我的理解,这个程序
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的那个程序就一直没法跑. 哪怕数组的其他四个位置空出来(进程执行完了)也没用.
是这样吗?

0 0