Я понимаю, что на это может быть сложно ответить, не зная, как настроен мой кластер, но я пытаюсь отправить задания (через 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=VALUE
NAME=() {CODE}
ошибка контузииИсправление ошибки изменило способ кодирования функций в .BASH_FUNC_NAME%%=() {CODE}
Очевидно, какая-то часть вашей установки выводит среду и анализирует ее. Это может быть либо частью SGE, либо чем-то специфичным для вашей установки. Вероятная причина сделать это — сохранить среду, в которой была отправлена задача, чтобы выполнить задачу в той же среде.
Что-то где-то определяет функцию, вызываемую module
в bash, и экспортирует ее. Код будет выглядеть примерно так:
module () {
…
}
export -f module
Исправление заключается в том, чтобы либо обновить анализатор среды до уровня, который может справиться с новой кодировкой bash, либо прекратить экспорт функций.