bash多进程批量处理
cat nothing.sh #!/bin/bash sleep 5 //发呆5秒 echo `date` //输出当前系统日期 好,那么这件事我要做1000次,那么for循环走起: #!/bin/bash for i in `seq 1000` do sh nothing.sh done exit 0
运行的时候,你会发现每过5s 输出了1行 date 的值,我们循环了1000次,那这个脚本执行完需要的时间至少是1000*5s 大约等于1个半小时。由于循环是串行的,脚本必须等待上一条循环结束,才能进行下一步的循环。
#!/bin/bash tmp_fifofile="/tmp/$$.fifo" mkfifo $tmp_fifofile //新建一个fifo类型的文件 exec 6<>$tmp_fifofile //将标示符(fd6)指向fifo类型文件 rm -rf $tmp_fifofile //可删可不删 thread=1000 //这里定义了我需要多个进程去干活 for ((i=0;i<$thread;i++)) do echo "" done >&6 //就是在fd6中放置了$thread个空行 for ((i=0;i<1000;i++)) //1000次循环,开了1000个进程 do read -u6 // 一次read -u6 就从fd6中去掉一个空行,然后向下执行,如果fd6中的空行没有了,就停在这里等待位置,从而实现了进程数量的控制。所以如果 我thread的值设为50个,那么其实我就是在用这50个进程就干活,如果进程开满了,就不会再开新的进程,如果旧的进程结束了,那么就会有新的进程进来继续干活。 { sh nothing.sh //这里是我需要干什么活 echo "">&6 //每个进程结束后,向fd6返回一个空行,告诉它, 我的活干完了,我的位置腾出来。 } & //命令是放在后台执行的 done wait //等待所有后台进程结束 exec 6>&- //关闭fd6 exit 0
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。