Bash中的进程池



我正在尝试获取一个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

你可以用 GNU 并行的sem轻松做到这一点:

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处理所有事情,并为每个内核运行一个进程。

您的方法可以工作,如下所示:

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

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

相关内容

  • 没有找到相关文章

最新更新