Bash에서 병렬 호출에 대한 시간 초과 추가

Bash에서 병렬 호출에 대한 시간 초과 추가

Sage MATH로 작성된 프로그램의 실행을 병렬화하고 자동화하기 위해 간단한 Bash 스크립트를 실행하고 있습니다.

#!/bin/bash
for i in {1..500}; do
  echo Spinning up threads...
  echo Round $i
  for j in {1..8}; do
    ../sage ./loader.sage.py &
  done
  wait
done 2>/dev/null

각 스레드에서 5초 후에 시간 제한을 추가하고 싶습니다.

../sage ./loader.sage.py &

시간 초과되어 스레드를 종료하고 실행을 계속합니다. 어떻게 해야 하나요? 이것이 멍청한 질문이라면 미리 사과드립니다. 구문을 올바르게 이해할 수 없는 것 같습니다. Ubuntu WSL에서 실행 중입니다. 제가 호출한 프로그램은 Python으로 작성되었으며 Singular와 연계하여 Sage MATH 인터프리터를 통해 실행되었습니다.

답변1

GNU 병렬 처리 사용:

parallel --timeout 5 -j 8 -N0 ../sage ./loader.sage.py ::: {1..4000} 2>/dev/null

../sage ./loader.sage.py이는 한 번에 8개의 작업을 4000번 실행하며 각각의 시간 제한은 5초입니다.

병렬 매뉴얼 페이지에서:

--timeout duration
           Time out for command. If the command runs for longer than duration seconds it will get killed as per --termseq.

참고: 이 명령은 전체 루프를 대체합니다.

답변2

man timeout - 내 Linux Mint에서는 OS를 선언하지 않았습니다.

timeout 5 ../sage ./loader.sage.py &

프로세스의 시작 및 중지를 보여주기 위해 일부 디버깅을 추가했습니다. Sage 시작 시 디스크가 제한되어 있고(캐시를 지워야 할 수 있음) 사용 가능한 CPU를 모두 사용할 수 없는 것 같습니다. (내가 아는 한) Python은 적시 컴파일되기 때문에 병목 현상이 발생할 수 있습니다.

#!/bin/bash

for i in {1..3}; do
    echo Spinning up threads...
    echo Round $i
    for j in {1..3}; do
        timeout 1.5 sleep 60 &
    done
    echo "==== $( date '+%H:%M:%S.%N') Before"; jobs
    ps -f
    wait
    echo "==== $( date '+%H:%M:%S.%N') After"; jobs
    ps -f
    echo; timeout 1.0 sleep 0.2
done

관련 정보