2017-07-10 2 views
0

Ich versuche, eine for Schleife zu erhalten, die nur ein Threaded Volatility Yara Scan-Modul basierend auf einer Liste von Regeln ausführen wird. Ein Scan pro Regel pro Kern. Grundsätzlich sollte die aktuelle Anzahl der laufenden vol.py-Prozesse mit der Kernanzahl verglichen und die laufenden Prozesse maximiert werden.Prozesspool in Bash

Wenn ich das aber ausführe, wird es für jede Regel einen Volatilitäts-Prozess erzeugen und nicht nur das Maximum von 4 (basierend auf meiner Kernzählung). Jede Hilfe mit der Syntax hier wäre großartig.

Zur Zeit habe ich dies:

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

Ich denke, Sie wollen "count" eine aktuelle Angabe der Anzahl der 'vol.py' Prozesse sein. Aber Sie messen das nur einmal am Anfang. Du wirst es innerhalb der Schleife wiederholen wollen. – slim

+0

Ah, okay. Platziere ich die Variable innerhalb der for-Anweisung oder der if-Anweisung? – JohnFowles

Antwort

0

Ihr Ansatz funktionieren könnte, mit so etwas wie:

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 

Alles, was ich habe mich verändert ist:

  • neu berechnen count jedes Mal, wenn wir fügen Sie einen Prozess hinzu
  • wait -n - nur für einen Job warten

Allerdings gibt einfachere Wege, dies zu erreichen, sind zu beenden. Eine davon ist mit xargs --max-procs:

cat $rules_path/rules.txt | xargs --max-procs="$cores" -n1 call_volatility 

... wo call_volatility ist ein Skript wie folgt aus:

#!/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 

Es gibt keine Garantie mit entweder Ansatz, dass die Prozesse gleichmäßig zwischen den Kernen verteilt werden .

+0

Gibt es eine Möglichkeit, den stdout und stderr in eine Datei zu pipen? Nicht sicher, wie man mkfifo mit dieser Schleife verwendet ... – JohnFowles

+0

Ich verstehe nicht, was Sie gerade fragen. Vielleicht muss es in einer separaten Frage gehen. Es gibt nichts, was dich daran hindern würde, mit Fifos zu arbeiten. – slim

+0

Ich werde ein bisschen damit arbeiten und sehen, was ich mir vorstellen kann, danke! – JohnFowles

1

Sie können dies mit sem von GNU parallel leicht tun:

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 

Sie müssen keine Kerne Prozesse zählen oder verwalten. sem verarbeitet alles und führt einen Prozess pro Kern aus.