web-dev-qa-db-fra.com

paramètre pour les scripts Shell démarré avec qsub

comment paramétrer un script Shell exécuté sur une grille (démarré avec qsub)? J'ai un script Shell, où j'utilise getopts pour lire les paramètres.

Lorsque je démarre (qsub script.sh -r firstparam -s secondparam ..) ce script de travail avec qsub, je reçois des messages d'erreur,

qsub: option non valide - s

qsub: valeur -r illégale

comme qsub pense que le paramètre est pour lui-même. Je n'ai pourtant trouvé aucune solution.

Merci

43
Martin

Je viens de découvrir comment le résoudre: il suffit d'imprimer les commandes du script Shell avec echo et de diriger le résultat vers qsub:

echo "./script.sh var1=13 var2=24" | qsub

20
Martin

L'utilisation de l'option qsub -v est la bonne façon:

qsub -v par_name=par_value[,par_name=par_value...] script.sh

nom_par peut être utilisé comme variable dans le script Shell.

44
volks

En plus de la réponse de volk, pour référencer les variables dans la liste (désignées par -v), vous utilisez simplement le nom que vous définissez dans votre appel. Donc, disons que vous avez appelé qsub comme suit

qsub -v foo='qux' myRunScript.sh

Ensuite myRunScript.sh pourrait ressembler à ceci:

#!/bin/bash
#PBS -l nodes=1:ppn=16,walltime=0:00:59
#PBS -l mem=62000mb
#PBS -m abe

bar=${foo}
echo "${bar}"

Où la sortie serait

qux

J'espère que cela t'aides!

35
jhrf

Il y a un meilleur moyen...

Je suis vraiment surpris de voir combien de temps cette question est restée sans une bonne réponse. Il se peut que la version spécifique de qsub n'ait pas été spécifiée. qsub existe au moins dans Torque et également dans Sun Grid Engine, peut-être d'autres ordonnanceurs. Il est donc important de savoir lequel vous utilisez. J'en parlerai ici:

COUPLE: qsub -F <arguments> command

page de manuel
Voici un exemple de la façon dont je l'utilise normalement. En commençant par cet exemple de script qui fait juste écho à tous les arguments qui lui sont passés:

$ cat testArgs.pbs
#!/usr/bin/env bash

echo $@

Je soumettrais le travail comme ceci:

$ qsub -F "--here are the --args" testArgs.pbs
3883919.pnap-mgt1.cm.cluster

Et voici à quoi ressemble le fichier de sortie après son exécution:

$ cat testArgs.pbs.o3883919
--here are the --args

Moteur Sun Grid: qsub command [ command_args ]

page de manuel
Vous ajoutez simplement les arguments après la commande, comme vous le feriez lors de l'exécution dans le shell. Je n'ai SGE en cours d'exécution nulle part, donc pas d'exemple pour celui-ci. Mais c'est la même chose avec Slurm, qui est en dessous

Slurm: sbatch command [ command_args ]

page de manuel
Ici, je soumets le même script que j'ai utilisé avec l'exemple Torque ci-dessus:

$ sbatch testArgs.sh what the heck
Submitted batch job 104331

Et les résultats:

$ cat slurm-104331.out
what the heck

Exportation de variables d'environnement! = Passage d'arguments

L'exportation de variables d'environnement est très différente de la transmission d'arguments à une commande.
Voici une bonne discussion sur les différences.

Les réponses qsub recommandent avant tout -v. Pour être clair, -v exporte les variables d'environnement, -F passe des arguments à la commande.

Je préfère généralement paramétrer mes scripts en permettant des arguments. En fait, je dirais qu'il est beaucoup plus courant d'utiliser des scripts comme celui-ci process_data.sh --threads 8 que de faire quelque chose comme export THREADS=8; process_data.sh.

12
calico_