내 클러스터가 어떻게 설정되었는지 모르는 경우 답변하기 어려울 수 있다는 것을 알고 있지만 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_config 파일:
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=VALUE
NAME=() {CODE}
쉘 쇼크. 버그 수정으로 인해 함수 인코딩이 .BASH_FUNC_NAME%%=() {CODE}
분명히 설정의 일부가 환경을 덤프하고 구문 분석합니다. 이는 SGE의 일부일 수도 있고 설정에 따라 다를 수도 있습니다. 이렇게 하는 유효한 이유는 작업이 제출된 환경을 동일한 환경에서 실행할 수 있도록 저장하기 위한 것입니다.
module
bash에서 호출되어 내보내지는 함수가 어딘가에 정의되어 있습니다. 코드는 다음과 같습니다
module () {
…
}
export -f module
해결 방법은 환경 파서를 새로운 bash 인코딩을 처리할 수 있는 버전으로 업그레이드하거나 기능 내보내기를 중지하는 것입니다.