.sh 스크립트의 주석에 매개변수 전달

.sh 스크립트의 주석에 매개변수 전달

저는 .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

관련 정보