首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash中的进程池

Bash中的进程池
EN

Stack Overflow用户
提问于 2017-07-10 15:51:46
回答 2查看 407关注 0票数 1

我试图获得一个for循环,它将只执行基于规则列表的线程化波动率yara扫描模块。每个规则每个核心扫描一次。基本上,它应该获取当前运行的vol.py进程的数量,并根据核心计数进行检查,并使运行的进程最大化。

但是,当我运行这个程序时,它会为每条规则生成一个波动过程,而不仅仅是最大的4(基于我的核心计数)。这里对语法的任何帮助都是很好的。

目前,我有以下几点:

代码语言:javascript
复制
count=$(ps aux | grep vol.py | wc -l)
cores=$(cat /proc/cpuinfo | grep processor | wc -l)
for x in $(cat $rules_path/rules.txt)
do
  if [ $count -lt $cores ]; then # we are under the limit
     echo $x
     vol.py -f /home/cuckoo/.cuckoo/storage/analyses/12/memory.dmp --profile=Win7SP1x64 yarascan --yara-file=$rules_path/allrules/$x --output=text --output-file=$out_dir/$x.log &>/home/$name/Desktop/error.txt & 
  else
     wait
  fi
done
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-10 16:06:22

您的方法可能会奏效,其方法如下:

代码语言:javascript
复制
cores=$(cat /proc/cpuinfo | grep processor | wc -l)
count=$(ps aux | grep vol.py | wc -l)
for x in $(cat $rules_path/rules.txt)
do
  if [ $count -lt $cores ]; then # we are under the limit
     echo $x
     vol.py -f /home/cuckoo/.cuckoo/storage/analyses/12/memory.dmp --profile=Win7SP1x64 yarascan --yara-file=$rules_path/allrules/$x --output=text --output-file=$out_dir/$x.log &>/home/$name/Desktop/error.txt & 
     count=$(ps aux | grep vol.py | wc -l)
  else
     wait -n
  fi
done

我所改变的就是:

  • 每次添加进程时重新计算count
  • wait -n --等待一项工作结束

然而,有更简单的方法来实现这一点。一个是和xargs --max-procs一起

代码语言:javascript
复制
cat $rules_path/rules.txt | xargs --max-procs="$cores" -n1 call_volatility 

..。其中call_volatility是这样的脚本:

代码语言:javascript
复制
#!/bin/bash
x=$1
vol.py -f /home/cuckoo/.cuckoo/storage/analyses/12/memory.dmp \
     --profile=Win7SP1x64 yarascan \
     --yara-file=$rules_path/allrules/$x \
     --output=text \
     --output-file=$out_dir/$x.log \
     &>/home/$name/Desktop/error.txt

这两种方法都不能保证流程在您的核心之间平均分配。

票数 0
EN

Stack Overflow用户

发布于 2017-07-10 16:21:07

您可以很容易地使用GNU并行中的sem完成这一任务:

代码语言:javascript
复制
for x in $(cat "$rules_path/rules.txt")
do
  sem -j +0 vol.py -f /home/cuckoo/.cuckoo/storage/analyses/12/memory.dmp \
      --profile=Win7SP1x64 yarascan --yara-file="$rules_path/allrules/$x" \
      --output=text --output-file="$out_dir/$x.log" \
         &> "/home/$name/Desktop/error.txt"
done

您不需要计算核心或管理流程。sem处理一切,每个核心运行一个进程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45016529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档