我正在运行一个简单的 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.py
4000 次,一次 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