it-swarm.com.de

Übergeben Sie Befehlszeilenargumente über Sbatch

Angenommen, ich habe das folgende einfache Bash-Skript, das ich über SLURM an einen Batch-Server senden möchte:

#!/bin/bash

#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"

hostname

exit 0

In diesem Skript möchte ich einfach die Ausgabe von hostname in eine Textdatei schreiben, deren vollständiger Name über die Befehlszeile gesteuert wird.

login-2:jobs$ sbatch -D `pwd` exampleJob.sh 1
Submitted batch job 203775

Leider scheint mein letztes Befehlszeilenargument (1) nicht über sbatch analysiert zu werden, da die erstellten Dateien nicht das Suffix haben, nach dem ich suche, und der String "$ 1" wird wörtlich interpretiert:

login-2:jobs$ ls
errFile$1.txt  exampleJob.sh outFile$1.txt

Ich habe nach Orten in SO und woanders gesucht , aber ich hatte kein Glück. Was ich suche, ist im Wesentlichen das Äquivalent des -v-Schalters des qsub-Dienstprogramms in Torque-fähigen Clustern.

Edit: Wie im zugrundeliegenden Kommentarthread erwähnt, löste ich mein Problem auf harte Weise: Anstelle eines einzigen Skripts, das mehrmals an den Batch-Server gesendet wurde, jedes mit unterschiedlichen Befehlszeilenargumenten, erstellte ich ein " Master-Skript ", das einfach den gleichen Inhalt auf verschiedene Skripten übertrug und umleitete, wobei der Inhalt jedes dieser Elemente durch den übergebenen Befehlszeilenparameter geändert wurde. Dann habe ich alle über sbatch an meinen Batch-Server übermittelt. Dies beantwortet jedoch nicht die ursprüngliche Frage, daher zögere ich, sie als Antwort auf meine Frage hinzuzufügen oder diese Frage als gelöst zu markieren.

17
Jason

Die Zeilen, die mit #SBATCH beginnen, werden nicht von bash interpretiert, sondern von sbatch ..__ durch Code ersetzt. Wenn Sie keine unterschiedlichen parallelen Sbatch-Prozesse haben, können Sie es versuchen

#!/bin/bash

touch outFile${1}.txt errFile${1}.txt
rm link_out.sbatch link_err.sbatch 2>/dev/null # remove links from previous runs
ln -s outFile${1}.txt link_out.sbatch
ln -s errFile${1}.txt link_err.sbatch

#SBATCH -o link_out.sbatch
#SBATCH -e link_err.sbatch

hostname
# I do not know about the background processing of sbatch, are the jobs still running
# at this point? When they are, you can not delete the temporary symlinks yet.

exit 0

Alternative: Wie Sie selbst in einem Kommentar sagten, könnten Sie ein Masterscript . Erstellen. Dieses Skript kann Zeilen wie

cat  exampleJob.sh.template | sed -e 's/File.txt/File'$1'.txt/' > exampleJob.sh
# I do not know, is the following needed with sbatch?
chmod +x exampleJob.sh

In Ihrer Vorlage sehen die #SBATCH-Zeilen aus

#SBATCH -o "outFile.txt"
#SBATCH -e "errFile.txt"
2
Walter A

Wenn Sie Ihre Befehle über die Befehlszeile übergeben, können Sie das Problem umgehen, dass Befehlszeilenargumente nicht im Batch-Skript übergeben werden können. So zum Beispiel in der Kommandozeile: 

var1="my_error_file.txt"
var2="my_output_file.txt"
sbatch --error=$var1 --output=$var2 batch_script.sh
10

Ich dachte, ich würde etwas Einblick bieten, weil ich auch nach der Ersetzung der -v-Option in qsub suchte, die für sbatch mit der --export-Option durchgeführt werden kann. Ich habe eine Nice site hier gefunden, die eine Liste der Konvertierungen von Torque nach Slurm zeigt und den Übergang viel glatter macht. Ich habe noch nicht bestätigt, dass dies speziell funktioniert, aber ich werde die Antwort entsprechend aktualisieren, wenn sie geändert werden muss.

Sie können die Umgebungsvariable vorab in Ihrem Bash-Skript angeben:

$ var_name='1'
$ sbatch -D `pwd` exampleJob.sh --export=var_name

Oder definieren Sie es direkt im Befehl sbatch, genau wie qsub zulässig:

$ sbatch -D `pwd` exampleJob.sh --export=var_name='1'

Ob dies in den #-Vorprozessoren von exampleJob.sh funktioniert, ist ebenfalls eine andere Frage, aber ich gehe davon aus, dass es die gleiche Funktionalität wie in Torque geben sollte.

7
MasterHD

Die Verwendung eines Wrappers ist bequemer. Ich habe diese Lösung aus diesem Thread gefunden.

Grundsätzlich besteht das Problem darin, dass die SBATCH-Direktiven als Kommentare von der Shell angesehen werden und Sie daher die übergebenen Argumente nicht verwenden können. Stattdessen können Sie ein Here-Dokument verwenden, um Ihr Bash-Skript einzugeben, nachdem die Argumente entsprechend festgelegt wurden.

Im Falle Ihrer Frage können Sie die Shell-Skriptdatei durch Folgendes ersetzen:

#!/bin/bash
sbatch <<EOT
#!/bin/bash

#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"

hostname

exit 0
EOT

Und Sie führen das Shell-Skript folgendermaßen aus:

bash [script_name].sh [suffix]

Die Ausgaben werden in outFile [Suffix] .txt und errFile [Suffix] .txt gespeichert

2
PouyaB

So etwas funktioniert für mich und Torque

echo "$(pwd)/slurm.qsub 1" | qsub -S /bin/bash -N Slurm-TEST
slurm.qsub:

#!/bin/bash
hostname > outFile${1}.txt 2>errFile${1}.txt
exit 0
1
user3665696