PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Script zum abschicken von vielen Jobs



Chemikus
08.08.14, 17:00
Hallo,
ich bin Wissenschaftler an der Uni Jena und rechne ab und zu auf diesem Cluster hier: http://www.uni-jena.de/omega.html

Wenn ich normal einen Job von meinem Rechner abschicke dann gebe ich in das Open SSH Fenster etwa folgendes ein:

cd ~/ Verzeichnispfad
jobsubmit09 Eingabedatei

danach kommt die Abfrage in welcher Queue ich rechnen will.

Dann kommt die Abfrage wie lange ich rechnen will (in vollen stunden)

Dann eine Bestätigungsabfrage wo ich einfach mit mit Enter bestätigen muss



Nun habe ich aktuell ein Problem bei dem ich sehr viele Jobs (ca. 100) abschicken muss, dass ganze aber dann nicht mehr mit der Hand machen möchte.

Ich dachte mir, dass es doch möglich sein sollte ein script zu schreiben, was das oben beschriebene Abfragespiel automatisch durchmacht, dann das Verzeichnis wechselt und das ganze mit der nächsten Datei macht.

Nur Leider habe ich keinerlei Ahnung von der Erstellung solcher Scripte.

Es wäre ganz toll, wenn ihr mir bei der Erstellung eines solches Scriptes zur Hilfe kommen könntet !

Vielen Dank schon mal im Voraus.

Chemikus

marce
08.08.14, 18:54
sind die Eingaben (Queue und Dauer) zwingend manuell zu machen oder kannst Du die auch in einer .ini-Datei, per Kommandozeile direkt oder anderweitig übergeben?

Falls ersteres - google mal nach Here-Dokument und expect.

Chemikus
08.08.14, 19:04
Nicht das ich wüsste aber es würde reichen wenn bei Queue immer big8 und Dauer 100 wäre

marce
08.08.14, 21:15
ok, in dem Fall würde ich es mal mit expect angehen - konkrete könnte man dann werden, wenn man wüsste, was denn da so "real" am System passiert (Ausgaben, Eingaben, ...)

http://www.thegeekstuff.com/2010/10/expect-examples/

Chemikus
08.08.14, 21:30
was das Script im Grunde nur machen müsste wäre:

Verzeichnis des Inputfiles anfahren
jobsubmit09 Name_Inputfile
Enter
big8
Enter
100
Enter
Enter

und wieder von vorne bis die vorher definierten Inputfiles abgearbeitet sind

Chemikus
11.08.14, 09:00
Hallo,

das Ganze Problem hat sich jetzt ein bisschen Vereinfacht. Das Script müsste nur noch den folgendne Befehl in der Kommandozeile ausführen:

jobsubmit09 <inputfile> -q short -t 100 -a y

Es wäre ganz toll wenn sich jemand finden würde, der mir die Syntax schreiben würde die diesen Befehl mit einer Reihe von Inputfiles abarbeitet. DANKE !

marce
11.08.14, 09:46
<inputfile> ist also eine Variable. Nennen wir die z.B. $inputfile.

... gehen wir dann noch davon aus, daß die $inputfiles alle in einem Verzeichnis liegen könnte man z.B. mit ls /Pfad/zum/Verzeichnis/* (oder mit find, ...) die entsprechende Liste erhalten, die man dann über eine Schleife for $inputfile in $(liste-erzeugen-befehl) abarbeiten könnte.

... sich dann noch ein paar Gedanken wegen der Dateinamen (Einschränkung auf Endungen, ggf. Quoting wegen Leer- und Sonderzeichen, ...) machen und das sollte es gewesen sein.

Chemikus
11.08.14, 09:56
Jedes Inputfile hat die Endung .gjf Geg. kommt nach dem Inputfile noch noch ein zweites mit dem gleichen Namen aber der Endung .chk

Chemikus
11.08.14, 14:56
Hallo,

also folgendes einfaches script funktioniert jetzt erstmal für beliebig viele Einträge:


#!/bin/bash

cd ~/Alanin/Test1

jobsubmit09 Ala_HF_6-31+Gdp_OPT.gjf -q oshort -t 100 -a y --dontaskchk

cd ~/Alanin/Test2

jobsubmit09 Ala_HF_6-31+Gdp_OPT.gjf -q oshort -t 100 -a y --dontaskchk



Was allerdings noch Toll wäre, wäre die Möglichkeit, dass das ganze eine zuvor eingegebene Liste von Verzeichnissen nach Dateien mit der Endung .gjf durchsucht und diese dann als Inputfile benutzt.

Könnt ihr mir da bitte weiterhelfen ich habe keine Ahnung wie man sowas realisiert.

Besten Dank !

Chemikus
12.08.14, 09:31
Hallo,

nun sieht das Script so aus:


#!/bin/bash

#inputdir="homes/iomc/ja94won/Alanin/Test/"

for inputfile in `find /homes/iomc/ja94won/Juglon_Derivate/GS_Opt -name "*.gjf"` ; do
inputname=$(basename "$inputfile")
#echo "Inputdir: $inputdir"
echo "Inputfile: $inputfile"
echo "Inputname: $inputname"
jobsubmit09 ${inputfile} -q oshort -t 200 -a y --dontaskchk

done


es erfüllt erstmal seinen Zweck nun aber die Frage: Es gibt bei manchen Rechnungen noch ein zweites Inputfile mit der Endung .chk welches direkt nachdem ersten inputfile abgefragt wird. Gibt es einen Web dies auch noch in die For Schleife einzubauen ? Also das auch noch geschaut wird ob noch ein passendes .chk File mit dem gleichen Namen vorhanden ist und dieses dann benutzt wird ?

Beste Grüße,
Chemikus

marce
12.08.14, 10:13
basename kennt noch eine weitere Option, die ein def. Endung abschneidet und also den reinen Dateinamen, ohne Endung, zurückliefert.

Du könntest also nach dem Durchlauf des ersten jobsubmit mit einer if-Abfrage testen, ob mit dem reinem Dateinamen und der def. Endung eine Datei existiert und diese dann übergeben.

Efraim
13.08.14, 09:00
Wer die Bash benutzt, braucht gar kein basename:


#!/bin/bash

for inputfile in `find /homes/iomc/ja94won/Juglon_Derivate/GS_Opt -name "*.gjf"` ; do

inputname="${inputfile##*/}"

#echo "Inputdir: $inputdir"
echo "Inputfile: $inputfile"
echo "Inputname: $inputname"
jobsubmit09 ${inputfile} -q oshort -t 200 -a y --dontaskchk


chkfile="${inputfile%.*}.chk"

if [ -f "$chkfile" ]; then
echo "Chkfile: $chkfile"
# ...
fi

done


Eine For-Schleife funktioniert übrigens nur richtig, wenn keine Leer- und sonstigen Sonderzeichen in den Dateinamen sind.