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

혼란을 더하기 위해 해당 작업 노드(위 예에서는 node156)에 직접 ssh를 사용하면 ls 및 호스트 이름 명령을 제대로 실행할 수 있습니다!

클러스터 관리자에게 연락했는데 그들은 내 문제를 복제할 수 없습니다(나로 로그인하더라도). 먼저 ~/.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 (ab)는 다음을 사용합니다.환경기능을 전달합니다. 일반적으로 환경은 형식의 일련의 항목 형식으로 데이터를 전달하는 데만 사용됩니다 . 이전 버전의 bash는 양식의 항목을 추가했는데 , 어떤 상황에서는 스크립트가 절대 사용하지 않을 변수를 정의하여 코드를 주입할 수 있었습니다.NAME=VALUENAME=() {CODE}쉘쇼크 버그. 버그 수정으로 인해 함수가 .BASH_FUNC_NAME%%=() {CODE}

분명히 설정의 일부는 환경을 덤프하고 구문 분석합니다. 이는 SGE의 일부일 수도 있고 설정과 관련된 것일 수도 있습니다. 이를 수행하는 이유는 작업이 제출된 환경을 저장하여 동일한 환경에서 작업을 실행하기 위한 것일 수 있습니다.

어딘가에서 bash에서 호출되는 함수를 정의 module하고 내보내는 것이 있습니다. 코드는 다음과 같습니다.

module () {
}
export -f module

해결 방법은 환경 파서를 새로운 bash 인코딩에 대처할 수 있는 것으로 업그레이드하거나 기능 내보내기를 중지하는 것입니다.

관련 정보