Пул процессов в 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
2 ответа
Ваш подход может работать с чем-то вроде:
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
Ни один из этих подходов не гарантирует, что процессы будут равномерно распределены между вашими ядрами.
Вы можете сделать это легко с 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
обрабатывает все и запускает один процесс на ядро.