Рабочая среда не настроена правильно на SGE

Рабочая среда не настроена правильно на SGE

Я понимаю, что на это может быть сложно ответить, не зная, как настроен мой кластер, но я пытаюсь отправить задания (через SGE) в кластер, но среда настроена неправильно, и задания не выполняются. Более того, есть два разных главных узла, в которые я могу войти, чтобы отправить задания в тот же кластер, и мои скрипты работают на одном, но не на другом.

Вот информация о машине для главного узла, на котором работает мой скрипт:

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

Машина, на которой это не работает:

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

Вот тестовый скрипт, который я использую:

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

Вот вывод после запуска «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

Чтобы добавить путаницы, когда я подключаюсь по ssh напрямую к этим узлам заданий (node156 в примере выше), я могу без проблем выполнить команды ls и hostname!

Я связался с администраторами кластера, и они не смогли воспроизвести мою проблему (даже если они вошли под моим именем). Сначала мы проверили, исправит ли это установка ~/.bashrc и ~/.bash_profile на значения по умолчанию, но этого не произошло. Вот эти файлы:

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

Какие-либо предложения?

решение1

У меня нет полного решения, потому что я ничего не знаю о SGE. Но я могу объяснить часть проблемы.

Машина, на которой работает ваш скрипт, работает под управлением старой версии операционной системы. Это видно не только по номеру версии ядра, но и по тому факту, что она давно не получала обновлений безопасности. В частности, я думаю, что она работает под управлением версии bash, которая уязвима дляКонтузияошибка.

Баш (аб)используетсредадля передачи функций. Обычно среда используется только для передачи данных в виде серии элементов формы . Более старые версии bash добавляют элементы формы , что в некоторых случаях позволяет внедрять код путем определения переменной, которую сценарий никогда не будет использовать —NAME=VALUENAME=() {CODE}ошибка контузииИсправление ошибки изменило способ кодирования функций в .BASH_FUNC_NAME%%=() {CODE}

Очевидно, какая-то часть вашей установки выводит среду и анализирует ее. Это может быть либо частью SGE, либо чем-то специфичным для вашей установки. Вероятная причина сделать это — сохранить среду, в которой была отправлена ​​задача, чтобы выполнить задачу в той же среде.

Что-то где-то определяет функцию, вызываемую moduleв bash, и экспортирует ее. Код будет выглядеть примерно так:

module () {
}
export -f module

Исправление заключается в том, чтобы либо обновить анализатор среды до уровня, который может справиться с новой кодировкой bash, либо прекратить экспорт функций.

Связанный контент