带超时的 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

还有一些患者在并行的recon-all过程中由于某些原因无法完成(可能会运行几天,这不正常)。我可以将并行运行时间限制为 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

相关内容