저는 .sh 스크립트를 사용하는 초보자이므로 무지함을 용서해주세요. 내 질문은 다음과 같습니다.
내 작업을 클러스터에 제출하려면 해당 제출 파일에 다음과 같은 "slurm 헤더"가 포함되어 있어야 합니다.
#!/bin/sh
#
########## Begin Slurm header ##########
#
#SBATCH --job-name=blabla
#
########### End Slurm header ##########
# Load module
module load math/matlab/R2020a
# Start a Matlab program
matlab -nodesktop -r "program $1 $2"
exit
두 개의 매개변수를 .sh 파일에 전달한 다음 이를 matlab 프로그램에 전달합니다. 입력 매개변수를 기반으로 Slurm 헤더의 작업 이름을 동적으로 만드는 방법은 무엇입니까?
단순히 #SBATCH --job-name=blabla$1$2
예측 가능한 콘텐츠를 작성하는 것은 효과가 없습니다.
답변1
작업에서 실행하려는 명령만 포함하여 다음과 같은 sbatch 작업 스크립트를 작성합니다.
#!/bin/sh
# you can include #SBATCH comments here if you like, but any that are
# specified on the command line or in SBATCH_* environment variables
# will override whatever is defined in the comments. You **can't**
# use positional parameters like $1 or $2 in a comment - they won't
# do anything.
# Load module
module load math/matlab/R2020a
# Start a Matlab program
# give it five arguments, -nodesktop, -r, program, and two
# more that you pass in as arguments to THIS script.
matlab -nodesktop -r "program" "$1" "$2"
# alternatively (since I don't know how matlab runs "program",
# or how it handles args or how it passes them on to a matlab
# script), maybe just three args:
# matlab -nodesktop -r "program $1 $2"
exit
예를 들어 원하는 대로 저장 ./mymatlabjob.sh
하고 실행 가능하게 만드세요.chmod +x mymatlabjob.sh
그런 다음 명령줄에서 실행합니다.
sbatch --job-name "whatever job name you want" ./mymatlabjob.sh arg1 arg2
matlab 작업에 전달하려는 매개변수는 어디에 있고 arg1
는 무엇입니까?arg2
또는 다음과 같은 중첩 루프에서:
#!/bin/sh
for i in 1 2 3; do
for j in 3 2 1; do
sbatch --job-name "blablah$i$j" ./mymatlabjob.sh "$i" "$j"
done
done
이 명령을 실행하면 sbatch를 사용하여 각각 다른 작업 이름을 가진 9개의 다른 작업이 실행됩니다($i 및 $j의 각 반복마다 하나씩).
답변2
내 생각엔 당신이 할 수 없을 것 같아요. 로 시작하는 모든 줄은 #
쉘에서 무시되며 및 쉘 내용 $1
입니다 . $2
많은 작업 관리자(slurm 포함)에는 일부 명령이 셸 주석으로 작성되어 있으므로 셸에서는 무시되지만 작업 관리자에서는 읽습니다. 이것은 당신의 SBATCH
라인입니다:
#SBATCH --job-name=blabla
따라서 동일한 스크립트에서 이를 동적으로 수행하는 것은 불가능합니다. 그러나 이를 수행하기 위해 래퍼 스크립트를 생성할 수 있습니다. 예를 들어:
#!/bin/sh
cat <<EoF
#!/bin/sh
#
########## Begin Slurm header ##########
#
#SBATCH --job-name=blabla$1$2
#
########### End Slurm header ##########
# Load module
module load math/matlab/R2020a
# Start a Matlab program
matlab -nodesktop -r "program $1 $2"
exit
EoF
이제 두 개의 매개변수를 사용하여 이 스크립트를 실행하면 실제로 원하는 스크립트가 인쇄됩니다.
$ foo.sh param1 param2
#!/bin/sh
#
########## Begin Slurm header ##########
#
#SBATCH --job-name=blablaparam1param2
#
########### End Slurm header ##########
# Load module
module load math/matlab/R2020a
# Start a Matlab program
matlab -nodesktop -r "program param1 param2"
exit
그래서 당신은 이것을 할 수 있습니다 :
foo.sh param1 param2 > slurm_script.sh