![Bash 스크립트 - N 프로세스가 항상 slurm에서 시작되는지 확인](https://linux55.com/image/225185/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20-%20N%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%ED%95%AD%EC%83%81%20slurm%EC%97%90%EC%84%9C%20%EC%8B%9C%EC%9E%91%EB%90%98%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8.png)
일
이 명령을 사용하여 원격 시스템에서 시작된 M개 작업/명령 목록에서 srun
모든 M개 작업이 시작될 때까지 항상 N개 작업이 실행 중이거나 요청되어 있는지(N<=M) 확인하세요.
동기 부여
(다른 제안으로 이어질 수 있으므로 포함됨) 저는 현재 2단계 프로세스를 통해 수행하고 있는 일련의 시뮬레이션을 실행해야 합니다. 두 단계 모두 MSTR_FILE
시뮬레이션에 대한 기본 정보를 포함하는 것을 기반으로 합니다 .
- 1단계: 다음 내용을 기반으로
MSTR_FILE
시뮬레이션에 필요한 디렉터리 및 파일을 생성합니다. - 2단계: 이제 내용을 기반으로
MSTR_FILE
파일의 각 항목에 대한 작업을 시작합니다.
두 번째 단계의 기본 루프는 다음과 같습니다.
for d in $(cat $MSTR_FILE | cut -d " " -f 1);do
cd $d
srun -p My_Queue $(cat sim_command_file)&
cd ..
done
이것은 잘 작동하지만 내 시뮬레이션 설정( MSTR_FILE
)은 50~100개, 어쩌면 그보다 더 많은 항목으로 끝납니다. 이러한 루프는 전체 목록을 반복하고 목록 자체가 끝날 때까지 리소스를 얻습니다. 공유 리소스 환경에서는 이는 실제로 이상적이지 않습니다. :)
내 작업 솔루션의 일부
wait
기본적으로 일정 수의 작업이 완료될 때까지 스크립트를 수정했습니다 . 스크립트의 관련 부분은 다음과 같습니다.
N=10
swp_list=($(cat $MSTR_FILE | cut -d " " -f 1))
cnt=0
list_size=$(#{swp_list[@]})
while [ $cnt -lt $list_size ];do
for i in $(seq 0 $N);do
ix=$(($cnt+$i))
if [ $ix -lt $list_size ];then
d=${swp_list[ix]}
cd $d
srun -p My_Queue $(cat sim_command_file)&
cd ..
fi
done
wait
((cnt+=$N))
done
제가 테스트한 바에 따르면 N
작업은 한 번에 실행되기 때문에 이 접근 방식은 잘 작동하는 것 같습니다. 그러나 여기에는 심각한 단점도 있습니다. 요청된 모든 작업이 N
동시에 시작되지 않는 경우가 있습니다. 이러한 작업 중 일부는 노드가 할당되기까지 오랜 시간을 기다립니다. 그렇지 않은 경우에도 일부 시뮬레이션 작업은 다른 시뮬레이션 작업보다 시간이 오래 걸릴 수 있으며, 심지어 훨씬 더 오래 걸릴 수도 있습니다.
부분적으로 작동하는 내 솔루션은 아무 것도 해결하지 못합니다. 단지 N
패킷의 모든 작업이 완료될 때까지 기다립니다. 하지만 시간이 낭비되지 않도록 queue
항상 다음 작업으로 채워져 있는 것이 있으면 좋겠습니다 .MSTR_FILE