Bash中的进程池

时间:2017-07-10 15:51:46

标签: linux bash volatility yara

我试图得到一个for循环,它只会根据规则列表执行线程易失性yara扫描模块。每个核心每个规则一次扫描。基本上它应该运行当前的vol.py进程数并检查核心数并最大化正在运行的进程。

但是,当我运行它时,它会为每个规则产生一个波动过程,而不仅仅是最大值4(基于我的核心数)。任何有关语法的帮助都会很棒。

目前我有这个:

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

2 个答案:

答案 0 :(得分:1)

您可以使用GNU parallel中的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

您无需计算核心数或管理流程。 define LOG(fmt, args...) fprintf(stdout, fmt, ## args); \ fflush(stdout) #define LOG_ERR(fmt, args...) fprintf(stderr, fmt, ## args); 处理所有内容,并为每个核心运行一个进程。

答案 1 :(得分:0)

您的方法可以起作用,例如:

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

cat $rules_path/rules.txt | xargs --max-procs="$cores" -n1 call_volatility 

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

#!/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

无论采用哪种方法都无法保证流程在您的核心之间均匀分布。