我试图得到一个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
答案 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
无论采用哪种方法都无法保证流程在您的核心之间均匀分布。