2017-07-10 2 views
0

私はforループを取得しようとしていますが、スレッドのボラティリティyaraスキャンモジュールはルールリストに基づいて実行されます。 1コアにつき1ルールにつき1スキャン。基本的には、実行中の現在の数の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

あなたは 'count'を' vol.py'プロセスの数の現在の指標にしたいと思います。しかし、あなたはこれを最初に一度だけ測定します。ループ内でもう一度やりたいと思うでしょう。 – slim

+0

ああ、大丈夫です。変数をfor文またはif文の内部に配置しますか? – JohnFowles

答えて

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 

。あなたはGNU平行からsemで簡単にこれを行うことができます

+0

stdoutとstderrをファイルにパイプする方法はありますか?このループでmkfifoを使う方法があまりにもわかりません... – JohnFowles

+0

私はあなたが何を求めているのか分かりません。おそらくそれは別の質問に行く必要があります。ここでは、あなたがFIFOで作業することを妨げるものは何もありません。 – slim

+0

私は少しそれを使用して、私は、ありがとう! – JohnFowles

1

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はすべてを処理し、コアごとに1つのプロセスを実行します。