시간 초과가 있는 GNU 병렬 종료 프로세스

시간 초과가 있는 GNU 병렬 종료 프로세스

예상 실행 시간을 초과하는 경우 GNU 병렬 프로세스를 중단할 수 있습니까? 예를 들어, 모든 처리를 감시하는 핸들러가 있습니다.

while [ -n "${ids[0]}" ] ; do
printf 'Processing ID: %s\n' "${ids[@]}" >&2

    /usr/bin/time -f "$timefmt" \
    printf '%s\n' "${ids[@]}" | parallel --jobs 0 recon-all -s {.} -all - 
    qcache -parallel -openmp 8

    n=$(( n + 1 ))
    ids=( "${all_ids[@]:n*4:4}" ) # pick out the next eight IDs
done

어떤 이유로 병렬 정찰 프로세스를 완료할 수 없는 환자도 있습니다(며칠 동안 실행될 수 있으며 이는 정상적이지 않습니다). 명령이 루프에서 다른 그룹을 실행하도록 병렬 실행 시간을 9시간으로 제한할 수 있습니까?

답변1

당신이 찾고있는 --timeout.

당신은 그것을 할 수 있습니다 --timeout 9h또는 당신은 그것을 할 수 있습니다 --timeout 1000%. 마지막 항목은 작업이 성공하는 데 걸리는 중앙값 시간을 측정하고 중앙값이 주어지면 중앙값 실행 시간의 1000%에 해당하는 시간 제한을 계산합니다.

백분율 사용의 좋은 점은 일반적인 상황에서 계산 프로그램이 더 빨라지거나 느려지더라도 시간 초과를 변경할 필요가 없다는 것입니다.

실제로 확인해보세요:

parallel --timeout 300% 'sleep {}; echo {}' ::: 100 2 3 1 50  2 3 1 2 1 3 2 1 4 2 1 2 3
# Compute program gets 10 times faster
parallel --timeout 300% 'sleep {=$_ /= 10 =}; echo {}' ::: 100 2 3 1 50  2 3 1 2 1 3 2 1 4 2 1 2 3

중앙값(평균 아님) 런타임은 성공적으로 완료된 작업의 중앙값을 기준으로 측정됩니다(최소값은 3개임). 따라서 8개의 작업이 있고 그 중 5개는 무한한 작업인 경우 런타임이 중앙값 시간 초과의 일정 비율에 도달하면 작업이 종료됩니다.

parallel --timeout 300% 'sleep {}; echo {}' ::: 1 2 1 2 100 2 1 2

이는 첫 번째 작업이 중단된 경우에도 작동합니다.

parallel --timeout 300% 'sleep {}; echo {}' ::: 100 2 1 2 1 2 1 2

작동하지 않는 유일한 경우는 모든 작업이 첫 번째 작업에서 멈춘 경우입니다.

parallel -j4 --timeout 300% 'sleep {}; echo {}' ::: 100 100 100 100 1 2 1 2

관련 정보