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.