1
나는 각 병렬 작업에 에서 까지의 정수 ID ( 아래 예에서 n
내가 알고 있는 값 ) 를 제공하는 작업 스케줄러(Slurm)가 있는 분산 컴퓨팅/서버 팜에 액세스할 수 있습니다 .n
n = 10
저는 find -maxdepth 1 -name '2019 - *'
프로그램에 인수로 전달할 파일 이름 목록을 찾는 데 사용합니다.
예시 파일 이름:
2019 - Alphabet
2019 - Foo Bar
2019 - Reddit
2019 - StackExchange
순서는 중요하지 않습니다. 일치하는 모든 파일은 한 번만 사용할 수 있습니다.
다음은 사용할 수 있는 "템플릿" 스크립트의 예입니다.
#!/bin/bash
# in this case, from i = 1 to i = 10
#SBATCH --array=1-10
# pseudocode begins
# it is given that filename_array has 10 unique elements
filename_array="$(find -maxdepth 1 -name '2019 - *')"
# SLURM_ARRAY_TASK_ID is the value of i, from i = 1 to i = 10
filename=filename_array[$SLURM_ARRAY_TASK_ID]
# pseudocode ends
./a.out "$filename"
이것이 수행하는 작업입니다(그러나 각 프로세스는 다른 시스템에서 병렬로 실행됩니다).
./a.out "./2019 - Alphabet" &
./a.out "./2019 - Foo Bar" &
./a.out "./2019 - Reddit" &
./a.out "./2019 - StackExchange" &
주어진 각 파일 이름에 대해 템플릿 스크립트를 한 번씩 실행하는 bash 스크립트를 어떻게 작성할 수 있습니까 find -maxdepth 1 -name '2019 - *'
?
답변1
find
특히 현재 디렉토리의 파일에만 관심이 있는 경우에는 를 사용하는 것이 실수일 수 있습니다. 쉘 글로브 모드를 사용할 수 있습니다.
#/bin/sh
for f in '2019 - '*
do
[ -f "$f" ] && ./a.out "$f" &
done
파일로 테스트하는 것은 이식성을 위한 것입니다. 를 사용하는 경우 일치하지 않는 패턴을 자체 대신 없음으로 확장하여 일치하는 파일이 없는 경우 루프가 한 번이 아닌 0번 실행되도록 할 수 있습니다 bash
. shopt -s nullglob
그러나 이식성이 좋으며 디렉터리 이름이 패턴과 일치하는 등의 상황을 처리할 수 있습니다.
분명히 필요한 것은 "템플릿 스크립트"이지만 그것이 의미하는 바는 제한적으로 이해하고 있습니다.
아마도
#!/bin/bash
# magic string for slurm to run on 10 hosts
#SBATCH --array=1-10
filename_array=( '2019 - '* )
filename=${filename_array[$SLURM_ARRAY_TASK_ID-1]}
./a.out "$filename"
그것은 무엇입니까?
편집: 또 다른 요구 사항이 변경되었습니다. 패턴에 대한 정규식을 지원합니다.
#!/bin/bash
# magic string for slurm to run on 10 hosts
#SBATCH --array=1-10
readarray -d '' filename_array < <( find . -maxdepth 1 -regex '.*2019 -.*' -print0 | sort -z )
filename=${filename_array[$SLURM_ARRAY_TASK_ID-1]}
./a.out "$filename"
답변2
당신은 그것을 사용할 수 있습니까 $SLURM_JOB_NODELIST
?
이 경우 GNU Parallel이 확실한 해결책처럼 보입니다.
find -maxdepth 1 -name '2019 - *' |
parallel --slf $SLURM_JOB_NODELIST --wd . ./a.out {}