我试图获得一个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发布于 2017-07-10 16:06:22
您的方法可能会奏效,其方法如下:
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我所改变的就是:
countwait -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-10 16:21:07
您可以很容易地使用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处理一切,每个核心运行一个进程。
https://stackoverflow.com/questions/45016529
复制相似问题