为 Bash 中的并行调用添加超时

为 Bash 中的并行调用添加超时

我正在运行一个简单的 Bash 脚本来并行化和自动执行用 Sage MATH 编写的程序:

#!/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.py4000 次,一次 8 个作业,每个作业超时 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 中,但你没有声明你的操作系统。

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

相关内容