예상 실행 시간을 초과하는 경우 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