Bash 스크립트 - N 프로세스가 항상 slurm에서 시작되는지 확인

Bash 스크립트 - N 프로세스가 항상 slurm에서 시작되는지 확인

이 명령을 사용하여 원격 시스템에서 시작된 M개 작업/명령 목록에서 srun모든 M개 작업이 시작될 때까지 항상 N개 작업이 실행 중이거나 요청되어 있는지(N<=M) 확인하세요.

동기 부여

(다른 제안으로 이어질 수 있으므로 포함됨) 저는 현재 2단계 프로세스를 통해 수행하고 있는 일련의 시뮬레이션을 실행해야 합니다. 두 단계 모두 MSTR_FILE시뮬레이션에 대한 기본 정보를 포함하는 것을 기반으로 합니다 .

  1. 1단계: 다음 내용을 기반으로 MSTR_FILE시뮬레이션에 필요한 디렉터리 및 파일을 생성합니다.
  2. 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

관련 정보