2016-07-05 28 views
0
#!/bin/bash 
#PBS -S /bin/bash 
#PBS -N garunsmodel 
#PBS -l mem=2g 
#PBS -l walltime=1:00:00 
#PBS -t 1-2 
#PBS -e error/error.txt 
#PBS -o error/output.txt 
#PBS -A improveherds_my 
#PBS -m ae 

set -x 
c=$PBS_ARRAYID 

nodeDir=`mktemp -d /tmp/phuong.XXXXX` 
cp -r /group/dairy/phuongho/garuns $nodeDir 
cp /group/dairy/phuongho/jo/parity1/my/simplex.bin $nodeDir/garuns/simplex.bin 
cp /group/dairy/phuongho/jo/parity1/nttp.txt $nodeDir/garuns/my.txt 
cp /group/dairy/phuongho/jo/parity1/delay_input.txt $nodeDir/garuns/delay_input.txt 

cd $nodeDir/garuns 

module load gcc vle 

XXX=`pwd` 

sed -i "s|/group/dairy/phuongho/garuns/out|$XXX/out/|" exp/garuns.vpz 

awk -v i="$c" 'NR == 1 || $8==i' my.txt > simplex-observed.txt 
awk -v i="$c" 'NR == 1 || $7==i {print $6}' delay_input.txt > afm_param.txt 
cp "/group/dairy/phuongho/garuns_param.txt" "$nodeDir/garuns/garuns_param.txt" 
while true 
do 
./simplex.bin & 
sleep 5m 
done 

awk 'NR >1' < simplex-optimum-output.csv>> /group/dairy/phuongho/jo/parity1/my/finalresuls${c}.csv 
cp simplex-all-output.csv "/group/dairy/phuongho/jo/parity1/my/simplex-all-output${c}.csv" 
#awk '$28==1{print $1, $12,$26,$28,c}' c=$c out/exp_tempfile.csv > /group/dairy/phuongho/jo/parity1/my/simulated_my${c}.csv 
cp /out/exp_tempfile.csv /group/dairy/phuongho/jo/parity1/my/exp_tempfile${c}.csv 

rm simplex-observed.txt 
rm garuns_param.txt 

Ich habe oben Bash-Skript, das mehrere Aufträge zur gleichen Zeit über PBS_ARRAYID senden ermöglicht. Mein Problem ist, dass mein Modell (simplex.bin) beim Ausführen etwas in mein Home-Verzeichnis schreibt. Also, wenn ein Job auf einmal läuft oder warten, bis die nächsten Jobs fertig sind, Sachen nach Hause zu schreiben, dann ist es in Ordnung. Da ich jedoch 1000 Jobs gleichzeitig haben möchte, versuchen 1000 von ihnen, das gleiche Zeug nach Hause zu schreiben, was dann zum Absturz führt. Gibt es eine clevere Möglichkeit, den zweiten Job einfach zu übermitteln, nachdem der erste bereits für eine bestimmte Zeit gestartet wurde (sagen wir 5 Minuten)? Ich habe bereits zwei Optionen überprüft und gefunden: Startet den 2. Job, wenn er fertig ist, oder startet zu einem bestimmten Datum/Zeitpunkt.QSub Array Job Verzögerung

Dank

+0

Sie können auch den ersten Job im Hintergrund starten, für einige Zeit schlafen, starten Sie den zweiten Job im Hintergrund und gehen Sie weiter so – GMichael

+0

@GMichael: können Sie es klarer bitte machen? – hieu

+0

Bitte sehen Sie meine Antwort unter – GMichael

Antwort

0

Sie können so etwas wie das folgende versuchen:

while [ yes ] 
do 
    ./simplex.bin & 
    sleep 2 
done 

Es endlos beginnt ./simplex.bin Prozess im Hintergrund, wartet 2 Sekunden, beginnt ein neuer ./simplex.bin usw.

Bitte Beachten Sie, dass Sie möglicherweise auch nohup benötigen und eine standardmäßige Eingabe-/Ausgabeumleitung für Ihre ./simplex.bin hinzufügen. Je nach Ihren genauen Anforderungen

+1

Wahrscheinlich möchten Sie 'while true;' da 'yes' niemals endet (und Ihr stdout mit Text füllt) und' '' ''ist in diesem Zusammenhang eher überflüssig. – tripleee

+0

Ich teste gerade Ihre Vorschläge! Danke – hieu

+0

Ich würde vorschlagen, "während Schlaf 2" - auf diese Weise, wenn Sie den Schlaf ein SIGTERM senden die Schleife wird nicht fortgesetzt. –

0

Wenn Sie Drehmoment verwenden, können Sie eine Obergrenze für die Zahl der Arbeitsplätze festlegen, die gleichzeitig ausgeführt werden können:

# Only allow 100 jobs to concurrently execute from this job array 
qsub myscript.sh -t 0-10000%100 

Ich weiß, das ist nicht genau das, was Sie suchen , aber ich schätze, Sie können ein Slotlimit finden, das es ohne Absturz laufen lässt.