您的位置:首页 > 运维架构 > Shell

[shell]bash-parallel

2016-06-23 13:55 661 查看
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的那个程序就一直没法跑. 哪怕数组的其他四个位置空出来(进程执行完了)也没用.

是这样吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: