[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的那个程序就一直没法跑. 哪怕数组的其他四个位置空出来(进程执行完了)也没用.
是这样吗?
- [shell]bash-parallel
- bash shell(bash) 快捷键
- bash shell(bash) 快捷键
- bash shell
- bash shell
- Shell(Bash)
- bash shell
- BASH SHELL
- shell bash
- bash shell
- bash shell
- Bash Shell
- Bash Shell
- bash shell
- BASH SHELL
- bash shell
- bash shell
- Bash-shell
- Mysql 水平拆分和垂直拆分
- redis之dict
- 大牛的距离(笑cry)精简算法
- cocoa pods的作用以及安装方法
- java学习:精通JAVA的25个标准
- [shell]bash-parallel
- 基础总结篇之九:Intent应用详解
- Android内容提供者(一)读取系统联系人
- I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之eMMC移植
- Spring文档学习--异常处理(Handling exceptions)以Shiro为例
- C++读写excel文件(一)—— 用ODBC读写
- 详细记录python的range()函数用法
- 自定义标签
- 使用Java开发高性能网站需要关注的那些事儿