[shell]bash-parallel
2016-06-23 13:55
661 查看
tcsh是不支持函数的,记住记住.
就像在linux的terminal下命令的时候可以在最后加一个
记得在最后加上个
这种好像是一个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/
这篇文章的作者还提到了用数组记录PID,
不知道我代码看得对不对,但是这个有些奇怪.
照我的理解,这个程序
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的那个程序就一直没法跑. 哪怕数组的其他四个位置空出来(进程执行完了)也没用.
是这样吗?
就像在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的那个程序就一直没法跑. 哪怕数组的其他四个位置空出来(进程执行完了)也没用.
是这样吗?
相关文章推荐
- shell 套用expect
- Shell替换:Shell变量替换,命令替换,转义字符
- Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
- shell变量
- shell简介
- 监控tomcat服务自动重新启动shell脚本
- 使用SHELL脚本取今天的剩余时间
- MySQL备份的shell脚本
- Shell的RANDOM变量
- Jenkins+SVN+Maven+Shell 实现项目一键发布
- shell脚本(一):变量的引用
- 清空日志shell脚本
- Shell脚本简介
- Shell脚本自动Telnet并执行远端机器的脚本
- Bash on windows无法联网的解决办法
- 64.SHELL
- 认识与学习bash
- Linux shell 前后台操作
- 在shell中对共享文件夹的访问
- 使用ssh登录shell脚本远程调用