Пул процессов в 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 обрабатывает все и запускает один процесс на ядро.

Другие вопросы по тегам