bash shell unix slurm

bash - Pasar argumentos de línea de comando a través de sbatch



shell unix (5)

Supongamos que tengo el siguiente script bash simple que quiero enviar a un servidor por lotes a través de SLURM:

#!/bin/bash #SBATCH -o "outFile"$1".txt" #SBATCH -e "errFile"$1".txt" hostname exit 0

En este script, simplemente quiero escribir la salida del hostname de hostname en un archivo de texto cuyo nombre completo controlo a través de la línea de comandos, así:

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

Desafortunadamente, parece que mi último argumento de línea de comando (1) no se analiza a través de sbatch, ya que los archivos creados no tienen el sufijo que estoy buscando y la cadena "$ 1" se interpreta literalmente:

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

He mirado alrededor de lugares en SO y en elsewhere , pero no he tenido suerte. Esencialmente, lo que estoy buscando es el equivalente al interruptor -v de la utilidad qsub en clústeres habilitados para Torque.

Edición : Como se mencionó en el hilo de comentarios subyacente, resolví mi problema de la manera más difícil: en lugar de tener un solo script que se enviaría varias veces al servidor de lotes, cada uno con diferentes argumentos de línea de comandos, creé un "script maestro" que simplemente hizo eco y redirigió el mismo contenido a diferentes scripts, el contenido de cada uno se modificó mediante el parámetro de línea de comando pasado. Luego sbatch todos esos a mi servidor por lotes a través de sbatch . Sin embargo, esto no responde a la pregunta original, así que vacilo en agregarla como respuesta a mi pregunta o marcar esta pregunta como resuelta.


Algo como esto funciona para mí y 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


Las líneas que comienzan con #SBATCH no son interpretadas por bash, pero son reemplazadas con código por sbatch. Las opciones de sbatch no admiten vars de $ 1 (solo% j y algunos otros, reemplazar $ 1 por% 1 no funcionará). Cuando no tienes diferentes procesos sbatch ejecutándose en paralelo, puedes probar

#!/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

Alternativa: como dijiste en un comentario, podrías hacer una escritura maestra. Este script puede contener líneas como

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

En su plantilla las líneas #SBATCH se ven como

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


Pensé en ofrecer algo de información porque también estaba buscando el reemplazo de la opción -v en qsub , que para sbatch se puede lograr utilizando la opción --export . Encontré un buen sitio aquí que muestra una lista de conversiones de Torque a Slurm, y la transición fue mucho más suave. No he verificado que esto funcione específicamente todavía, pero actualizaré la respuesta en consecuencia si es necesario cambiarlo.

Puede especificar la variable de entorno antes de tiempo en su script de bash:

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

O sbatch directamente dentro del comando sbatch tal como qsub permitió:

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

Si esto funciona en los # preprocesadores de exampleJob.sh también es otra pregunta, pero supongo que debería dar la misma funcionalidad que se encuentra en Torque.


Si pasa sus comandos a través de la línea de comandos, realmente puede evitar el problema de no poder pasar los argumentos de la línea de comandos en el script por lotes. Así, por ejemplo, en la línea de comando:

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


Usar una envoltura es más conveniente. Encontré esta solución de este hilo .

Básicamente, el problema es que las directivas SBATCH son vistas como comentarios por el shell y, por lo tanto, no puede usar los argumentos pasados ​​en ellas. En su lugar, puede usar un documento aquí para incluir en su script de bash una vez que los argumentos se hayan configurado en consecuencia.

En el caso de su pregunta, puede sustituir el archivo de script de shell con esto:

#!/bin/bash sbatch <<EOT #!/bin/bash #SBATCH -o "outFile"$1".txt" #SBATCH -e "errFile"$1".txt" hostname exit 0 EOT

Y ejecuta el script de shell de esta manera:

bash [script_name].sh [suffix]

Y las salidas se guardarán en outFile [sufijo] .txt y errFile [sufijo] .txt