Passer des arguments de ligne de commande via sbatch
Supposons que j'ai suivantes simple script bash qui je veux soumettre à un lot de serveur par le biais de SLURM:
#!/bin/bash
#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"
hostname
exit 0
Dans ce script, je veux simplement écrire la sortie de hostname
sur un fichier texte dont le nom complet je de contrôle via la ligne de commande, comme suit:
login-2:jobs$ sbatch -D `pwd` exampleJob.sh 1
Submitted batch job 203775
Malheureusement, il semble que mon dernier argument de ligne de commande (1) n'est pas analysée par sbatch, étant donné que les fichiers créés n'ont pas le suffixe je suis à la recherche et à la chaîne "$1" est interprété littéralement:
login-2:jobs$ ls
errFile$1.txt exampleJob.sh outFile$1.txt
J'ai regardé à travers les lieux de DONC et d'ailleurs, mais je n'ai pas eu de chance. Essentiellement, ce que je cherche est l'équivalent de la -v
commutateur de la qsub
utilitaire en Couple permis aux clusters.
Modifier: Comme mentionné dans le fil de commentaires, j'ai résolu mon problème de la manière dure: au lieu d'avoir un seul script qui serait soumis à plusieurs reprises pour le serveur de traitement par lots, chacun avec différents arguments de ligne de commande, j'ai créé un "script" que simplement l'écho et redirigé le même contenu sur différents scripts, le contenu de chaque être modifiée par le paramètre de ligne de commande passé. Ensuite, j'ai soumis tous ceux de mon serveur de traitement par lots grâce à sbatch
. Cependant, cela ne répond pas à la question d'origine, j'ai donc hésitez pas à l'ajouter comme une réponse à ma question ou marquer cette question résolu.
touch outfile${1}.txt
lignes, de sorte que nous pouvons essayer de reproduire l'erreur et la corriger?Le 1 est transmis le script, mais il n'est pas considéré pour le nom des fichiers que slurm pré-traite le fichier pour obtenir les drapeaux, mais la variable devrait être disponible à l'intérieur du script. Comment faites-vous cela sur le Couple?
Votre solution a fonctionné dans le cas de
touch
, c'est l'argument que je passe par sbatch
est correctement lu par le script comme $1
. Cependant, il semble que $1
est interprété littéralement par sbatch
dans le cas de -o
et -e
, tel que je me retrouve avec des fichiers tels que des outFile${1}.txt
sur le disque. @CarlesFenoy: je crois que vous avez raison dans ce que vous dites dans ce SLURM pré-traite le fichier pour obtenir le -o
et -e
drapeaux (voir ma réponse à @WalterA ci-dessus). En Couple, vous pourriez faire quelque chose comme qsub -D 'pwd' -v var=1 script.sh
et $var
aurait la valeur de 1 dans script.sh
.Je devrais aussi mentionner que j'ai résolu mon problème à la dure, c'est-à-créer un tas de scripts avec un "script" que le simple fait écho à bon nombre de lignes de contenu pour tenir compte de tous les différents paramètres de ligne de commande que je voulais transmettre à un seul script, et ensuite soumis tous à mon lot de serveur par le biais de
sbatch
. Ceci, cependant, ne pas répondre à la question à portée de main, donc je hésitez pas à l'ajouter à ma propre réponse à la question d'origine. Je vais aussi faire un edit dans le post original pour en tenir compte.OriginalL'auteur Jason | 2014-12-30
Vous devez vous connecter pour publier un commentaire.
Les lignes commençant par #SBATCH ne sont pas interprétées par bash, mais sont remplacés par code par sbatch.
Le sbatch options ne prennent pas en charge de 1 $vars (uniquement %j et quelques autres, le remplacement de $1 par %1 ne fonctionne pas).
Lorsque vous n'avez pas différents sbatch processus s'exécutant en parallèle, vous pouvez essayer de
Alternative:
Comme vous l'avez dit dans un commentaire vous-même, vous pourriez faire une masterscript.
Ce script peut contenir des lignes comme
Dans votre modèle #SBATCH lignes de ressembler à
Cela ne fonctionne pas comme #SBATCH paramètres doivent apparaître avant toute autre commande sinon ils sont ignorés
Vous avez peut-être raison, je n'ai pas réellement essayé avec Slurm. J'ai regardé votre lien, et je pense que mon script doit être divisée en une partie utilisées par Slurm (#SBATCH lignes) et un mainscript qui va appeler Slurm. Que masterscript doit se détacher de son enfant et ne sait pas quand pour nettoyer la des liens temporaires. Donc je suppose que la solution alternative (avec un modèle), j'ai donné fonctionne mieux. Savez-vous si vous pouvez mettre des Variables Shell dans un
<filename pattern>
? Quelque chose comme--output=File${some_var}.out
ou--output=File${myshell.sh}.out
?Seulement si vous passer le script de soumission via stdin pour
sbatch
plutôt que de les fournir en argument.OriginalL'auteur Walter A
Si vous passer vos commandes via la ligne de commande, vous pouvez contourner le problème de ne pas être en mesure de passer des arguments de ligne de commande dans le script de commandes. Ainsi, par exemple, à la ligne de commande :
OriginalL'auteur irritable_phd_syndrom
Je pensais offrent un aperçu parce que j'étais également à la recherche pour le remplacement de la
-v
option dansqsub
, qui poursbatch
peut être accompli en utilisant la--export
option. J'ai trouvé un beau site ici qui présente une liste des conversions de Couple à Slurm, et il a fait la transition beaucoup plus lisse. Je n'ai pas vérifié que cela fonctionne spécifiquement encore, mais je vais mettre à jour la réponse en conséquence s'il doit être changé.Vous pouvez spécifier la variable d'environnement à l'avance dans votre script bash:
Ou le définir directement dans le
sbatch
commande commeqsub
permis:Si cela fonctionne dans la
#
préprocesseurs deexampleJob.sh
est aussi une autre question, mais je suppose qu'il doit donner les mêmes fonctions que l'on retrouve dans le Couple.OriginalL'auteur MasterHD
Quelque chose comme cela fonctionne pour moi, et le Couple
OriginalL'auteur user3665696