scripts script resueltos programacion pasar parametros español ejercicios ejemplos comandos linux shell grid-computing qsub

linux - resueltos - parámetro para scripts de shell que se inicia con qsub



scripts linux ejercicios resueltos (4)

¿Cómo puedo parametrizar un script de shell que se ejecuta en una grilla (se inició con qsub)? Tengo un script de shell, donde utilizo getopts para leer los parámetros.

Cuando comienzo (qsub script.sh -r firstparam -s secondparam ..) este script de trabajo con qsub recibo mensajes de error,

qsub: opción no válida - s

qsub: valor ilegal -r

como qsub piensa que el parámetro es para sí mismo. Sin embargo, no he encontrado ninguna solución.

Gracias


Hay una mejor manera...

Estoy realmente sorprendido de cuánto tiempo ha transcurrido sin una buena respuesta. Puede ser que la versión específica de qsub no se haya especificado. qsub existe al menos en Torque y también en Sun Grid Engine, tal vez en otros programadores. Entonces, es importante saber qué estás usando. Voy a hablar de algunos aquí:

PAR: qsub -F <arguments> command

página man
Aquí hay un ejemplo de cómo normalmente lo uso. Comenzando con este script de ejemplo que simplemente hace eco de cualquier argumento que se le pase:

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

Yo enviaría el trabajo de esta manera:

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

Y así es como se ve el archivo de salida después de ejecutarse:

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

Sun Grid Engine: qsub command [ command_args ]

página man
Simplemente agregue los argumentos después del comando, al igual que lo haría al ejecutar en el shell. No tengo SGE funcionando en ningún lado, así que no hay ejemplo para este. Pero es lo mismo con Slurm, que está debajo

Slurm: sbatch command [ command_args ]

página man
Aquí presento el mismo script que utilicé con el ejemplo de Torque anterior:

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

Y los resultados:

$ cat slurm-104331.out what the heck

Exportando variables de entorno! = Pasando argumentos

Exportar variables de entorno es muy diferente de pasar argumentos a un comando.
Aquí hay una buena discusión sobre las diferencias.

Las respuestas qsub sobre todo recomiendan -v . Para que quede claro, -v exporta variables de entorno, -F pasa los argumentos al comando.

Generalmente prefiero parametrizar mis scripts al permitir argumentos. De hecho, diría que es mucho más común usar scripts como este process_data.sh --threads 8 que hacer algo como export THREADS=8; process_data.sh export THREADS=8; process_data.sh .


Acabo de descubrir cómo resolverlo: simplemente imprime los comandos del shell scrip con echo y canaliza el resultado a qsub:

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


Además de la respuesta de volk, para hacer referencia a las variables en la lista (designadas por -v) simplemente use el nombre que defina en su llamada. Entonces, digamos que hiciste una llamada a qsub de la siguiente manera

qsub -v foo=''qux'' myRunScript.sh

Entonces myRunScript.sh podría verse más o menos así:

#!/bin/bash #PBS -l nodes=1:ppn=16,walltime=0:00:59 #PBS -l mem=62000mb #PBS -m abe bar=${foo} echo "${bar}"

Donde el resultado sería

qux

¡Espero que esto ayude!


Usar la opción qsub -v es la forma correcta:

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

par_name se puede usar como variable en el script de shell.