2016-08-01 20 views
3

ausführen Ich habe ein sehr einfaches Skript, um mehrere Kopien eines Windows-Populationsgenetikprogramms (msvar.exe) unter Wine auszuführen. Es verwendet "find", um mehrere Ordner nach einer Initialisierungsdatei (INTFILE) zu durchsuchen, und startet dann eine Instanz von msvar.exe in jedem Verzeichnis mit dieser Initialisierungsdatei. Unterschiedliche Ordner haben unterschiedliche Parameter in der Initialisierungsdatei, so dass ich eine Reihe von Simulationen ausführen kann, indem ich den Parameter "&" hinzufüge. Hier ist es;Windows-Programm unter Wein mit gnu parallel

for i in $(find /home/msvartest -name INTFILE -type f) 
do (
cd $(dirname $(realpath $i)); 
# wine explorer /desktop=name msvar.exe; 
wineconsole --backend=user msvar.exe; 
) & 
done 

Im Moment habe ich auf einmal 20 Exemplare von msvar.exe laufen auf jeder unter seinem eigenen wineconsole (oder Wein-Explorer-Fenster) auf meinem Dual hexacore Maschine. Jede Ausführungsinstanz kann 3 oder 4 Tage dauern, aber das Programm läuft nur auf einem einzigen Kern, daher muss ich die Simulationen parallel ausführen. Es sieht so aus, als ob Gnu parallel eine bessere Möglichkeit wäre, msvar.exe auszuführen und mir mehr Simulationen über entfernte Computer zu ermöglichen. Ich habe erfolglos versucht, Gnu parallel mit wineconsole zu arbeiten, indem ich den Vorschlägen in Run wine in parallel with gnu-parallel - needs {%} slot substitution to work folgte. Ist jemand in der Lage zu helfen oder besser noch ein Skript zu knacken, das ich verwenden könnte?

Danke für Ihre Hilfe.

+0

Es ist sehr schmeichelhaft, dass Sie meine Antwort akzeptiert, aber eigentlich ist die Antwort von @OleTange (wer der Autor des brillanten ** GNU Parallel ist **) ist die korrektere ein - seinen Kommentar sieht unter meinem Antworten. –

+0

Leider war ich nicht schlau genug, um Ole's Skript zum Laufen zu bringen - wie peinlich !! – dberryman

Antwort

2

Ich denke, Ihr Befehl schrecklich lange erhalten wird und unhandlich, wenn Sie eine exportierte Funktion wie folgt verwendet werden:

#!/bin/bash 

doit() { 
    ... 
    ... 
} 

export -f doit 
parallel -j 10 doit ::: {0..99} 

für Ihr Beispiel so, dass so etwas wie (ungetestet) aussehen:

#!/bin/bash 

doit() { 
    echo Processing $1 
    cd $(dirname $(realpath "$1")); 
    WINEPREFIX=$HOME/slot{%} wineconsole --backend=user msvar.exe 
} 
export -f doit 

find /home/msvartest -name INTFILE -type f | parallel --dry-run doit 

Leider habe ich Ihre Umgebung nicht eingerichtet, um dies zu testen, aber es sollte nahe und leicht zu korrigieren sein, wenn es kleinere Fehler gibt. Versuchen Sie und sehen Sie, was es tut, dann entfernen Sie die --dry-run, damit es tatsächlich etwas tun kann.

Wenn Sie Leerzeichen in Dateinamen, sollten Sie mit Ihrem -print0find Befehl verwenden und auch -0 nach parallel hinzufügen, aber das verkompliziert die Dinge nur für den Moment.

+0

{%} wird nicht in der Funktion ersetzt - nur in der Befehlszeile. –

+0

Fantastisch, das hat mich in die richtige Richtung weisen und ich verstehe sogar grob, wie sie funktionieren (ich bin Biologe und kenne nur genug Programmieren um gefährlich zu sein !!). Nun zur Frage nach der Verwendung von parallel zur Ausführung von msvar.exe auf entfernten Servern. Wenn ich nur die Details des Remote-Servers zwischen "parallel" und "doit" (der Hilfedatei folgend) hinzufüge, sagt der entfernte Server "doit" ist kein Befehl, aus offensichtlichen Gründen sogar für mich. Wie kann dies geändert werden, um einen Datenordner zu kopieren und zu ermöglichen, dass dieser auf einem entfernten Server mit msvar., Exe installiert wird? – dberryman

+1

YIKES! Sie kommen auch an die Grenzen meiner Fähigkeiten! Vielleicht sollte alles auf einem Server funktionieren und dann eine neue Frage stellen, wie man die Daten verteilt und parallel über zusätzliche, entfernte Server arbeitet - und hoffe, dass Ole immer noch zusieht, wie er es immer tut. –

1
#!/bin/bash 

doit() { 
    echo Processing $1 
    cd $(dirname $(realpath "$1")); 
    WINEPREFIX=$HOME/slot$2 wineconsole --backend=user msvar.exe 
} 
export -f doit 

find /home/msvartest -name INTFILE -type f | parallel doit {} {%} 
+0

Ja, du hast recht - wie immer. Das sieht besser aus ;-) –