1

我试图得到一个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
4

2 回答 2

2

sem您可以使用GNU 并行轻松地做到这一点:

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处理一切,每个核心运行一个进程。

于 2017-07-10T16:21:07.023 回答
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

这两种方法都不能保证进程将在您的内核之间均匀分布。

于 2017-07-10T16:06:22.930 回答