Me doy cuenta de que esto podría ser difícil de responder sin que usted sepa cómo está configurado mi clúster, pero estoy intentando enviar trabajos (a través de SGE) a un clúster, pero el entorno no está configurado correctamente y los trabajos fallan. Además, hay dos nodos maestros diferentes en los que puedo iniciar sesión para enviar trabajos al mismo clúster, y mis scripts funcionan en uno pero no en el otro.
Esta es la información de la máquina para el nodo maestro en el que funciona mi script:
cat /proc/version
Linux version 2.6.32-279.el6.x86_64 ([email protected]) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Wed Jun 13 18:24:36 EDT 2012
La máquina en la que no funciona:
cat /proc/version
Linux version 3.10.0-514.6.2.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Thu Feb 23 03:04:39 UTC 2017
Aquí hay un script de prueba que estoy usando:
#!/bin/bash -I
#$ -wd ~
#$ -N test
#$ -o ~/test.log
#$ -j y
#$ -terse
#$ -V
#$ -notify
#$ -l h_vmem=2G -pe smp 1 -l athena=true
ls
hostname
nproc
Aquí está el resultado después de ejecutar "qsub test.sh":
/bin/bash: module: line 1: syntax error: unexpected end of file
/bin/bash: error importing function definition for `BASH_FUNC_module'
/opt/sge/default/spool/execd/node156/job_scripts/1063646: line 11: ls: command not found
/opt/sge/default/spool/execd/node156/job_scripts/1063646: line 12: hostname: command not found
Para aumentar la confusión, cuando hago ssh directamente a esos nodos de trabajo (nodo156 en el ejemplo anterior), puedo ejecutar los comandos ls y hostname sin problemas.
Me puse en contacto con los administradores del clúster y no pueden replicar mi problema (incluso si inician sesión como yo). Primero probamos que si configurar ~/.bashrc y ~/.bash_profile en la configuración predeterminada lo solucionaría, pero no fue así. Aquí están esos archivos:
cat ~/.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
.bash_profile:
cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
¿Alguna sugerencia?
Respuesta1
No tengo una solución completa porque no sé nada sobre SGE. Pero puedo explicar parte del problema.
La máquina donde funciona su script ejecuta una versión antigua del sistema operativo. Esto es evidente no sólo por el número de versión del kernel, sino también por el hecho de que no ha recibido actualizaciones de seguridad por un tiempo. Específicamente, creo que está ejecutando una versión de bash que es vulnerable alNeurosis de guerrabicho.
Bash (ab) usa elambientepara pasar funciones. Normalmente el entorno sólo se utiliza para pasar datos, en forma de una serie de elementos del formulario . Las versiones anteriores de bash agregan elementos del formulario , que en algunas circunstancias permitían inyectar código definiendo una variable que un script nunca usaría: elNAME=VALUE
NAME=() {CODE}
insecto de concha. La solución al error cambió la forma en que se codifican las funciones en .BASH_FUNC_NAME%%=() {CODE}
Evidentemente, alguna parte de su configuración descarta el entorno y lo analiza. Esto puede ser parte de SGE o algo específico de su configuración. Una razón plausible para hacer esto es guardar el entorno en el que se envió un trabajo para ejecutar el trabajo en el mismo entorno.
Algo en alguna parte está definiendo una función llamada module
en bash y exportándola. El código se vería así
module () {
…
}
export -f module
La solución es actualizar el analizador de entorno a algo que pueda soportar la nueva codificación bash o dejar de exportar funciones.