linux shell多进程通信,linux shell控制并发进程数实践 · BG2BKK Site

shell脚本多线程应用同事将新上线APP的一部分log交给我,让我统计下这些log中供出现了哪些deviceid采用awk就可以实现这部分匹配和统计功能,还是比较简单的

挑战在于,这批log文件非常多非常大,单进程工作处理起来非常的慢。因此我想到了多进程方式。

以往需要使用shell来实现多进程时,采用以下模板for seq; do

{

task

}&

done* 当任务较为简单,并发数不多时,这招很管用。然而现在log文件有好几K个,grep处理文件非常耗CPU,上述模板将会按文件数启动进程,系统的CPU Load一跃而起,泪目。

* 此时的情况是,解决问题的思路和方向没有错,方式上还需要改进。关键在于:控制并发任务,合理使用CPU。

* 如何在shell中控制并发进程数呢,我找到这样一个帖子

* http://blog.sciencenet.cn/blog-548663-750136.htmlshell脚本中控制并发任务数的大体方式是:初始化token池,形成一定token空间,又能在为空时阻塞想拿token的进程生成一个数组,执行任务前先从数组中获得一个元素,能够获得就继续执行,否则阻塞。数组大小最好为CPU核心数。任务执行完成后将元素放回,以供别的进程使用。

生成一个阻塞访问的管道pipe,先向管道中写入若干行,任务执行前从管道中获取token,任务结束后放回。

最终脚本如下所示我在理解这个脚本的时候感到吃力,比如exec、read等既熟悉又陌生的指令,毕竟没写过shell脚本

后来我发现,man bash和man sh是第一手消息资料if -p $directory中,-p是什么意思,在man bash的CONDITIONAL EXPRESSIONS中

read -u999中,-u又是什么意思,在man bash的 SHELL BUILTIN COMMANDS的read指令中

exec 999<>$Pfifo中,man bash的REDIRECTION小节中#!/bin/sh

awk=/usr/bin/awk

uniq=/usr/bin/uniq

Nproc=24

#$$是进程pid

Pfifo="/tmp/$$.fifo"

mkfifo $Pfifo

#以999为文件描述符打开管道,<>表示可读可写

exec 999<>$Pfifo

rm -f $Pfifo

#向管道中写入Nproc行,作为令牌

for((i=1; i<=$Nproc; i++)); do

echo

done >&999

echo '' > out

echo '' > ooo

filenames=`ls *.log`

for filename in $filenames; do

#从管道中取出1行作为token,如果管道为空,read将会阻塞

#man bash可以知道-u是从fd中读取一行

read -u999

{

#所要执行的任务

`$awk -F',' '/did/ {for(i=1;i<=NF;i++) if($i ~ /did/) print $i i}' $filename | $awk -F':' '{print $2}' | $awk -F'"' '{print $2}' | $uniq | $awk '{count[$1]++}END{for(name in count)print name >> "out"}'` && {

echo "$filename done"

} || {

echo "$filename error"

}

sleep 1

#归还token

echo >&999

}&

done

#等待所有子进程结束

wait

#关闭管道

exec 999>&-

echo `$awk '{count[$0]++}END{for(name in count)print name}' out > ooo; awk 'END{print NR}' ooo`单进程方式处理这些log需要3个小时,而控制并发进程数的话只需要10分钟不到。可见大部分计算资源都浪费在CPU切换上了。

参考链接

linux shell 和 lsof 等工具使用的一些tips

文件描述符与进程间通信

linux shell cocurrency并发控制

awk&sed

about the author如果关于本文您有兴趣,我们可以进一步探讨、交流和学习。我的email是 bg2bkk # gmail.com. 欢迎交流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值