我正在使用jobs
命令来控制计算密集型进程的数量。我不想一次运行超过max_cnt
个进程,并且仅在所有进程都停止后才停止。
我使用下面的bash脚本来完成此操作。但是,此代码始终将一个进程列出为正在运行,即使在一切执行和停止之后也是如此。
此外,在htop
的进程列表中找不到该进程。我应该怎么做或应该在哪里寻找echo $(jobs -p)
命令的结果列出的进程,以及如何解决即使一切都停止也不退出的问题。
#!/usr/bash
SLEEP=5
max_cnt=8
# generate a random number less than eq $1
function random {
rand=$RANDOM
while [ "$rand" -gt $1 ]
do
rand=$RANDOM
done
}
function job {
# resource intensive job simulated by random sleeping
echo param1="$1",param2="$2"
random 20
echo Sleeping for $rand
sleep $rand
}
for param1 in 1e-6 1e-5 1e-4 1e-3 1e-2
do
for param2 in "ones" "random"
do
echo starting job with $param1 $param2
job $param1 $param2 &
while [ "$(jobs -p|wc -l)" -ge "$max_cnt" ]
do
echo "current running jobs.. $(jobs -p|wc -l) ... sleeping"
sleep $SLEEP
done
done
done
while [ "$(jobs -p|wc -l)" -ge 1 ]
do
echo "current running jobs.. $(jobs -p|wc -l) ... sleeping"
sleep $SLEEP
echo $(jobs -p)
done
如评论中所述,您可能要考虑使用GNU Parallel,它在管理并行作业时使工作变得更轻松。您的代码可能如下所示:
#!/usr/bin/env bash
function job {
# resource intensive job simulated by random sleeping
echo param1="$1",param2="$2"
((s=(RANDOM%5)+1))
echo Sleeping for $s
sleep $s
}
# export function to subshells
export -f job
parallel -j8 job {1} {2} ::: 1e-6 1e-5 1e-4 1e-3 1e-2 ::: "ones" "random"
样本输出
param1=1e-6,param2=ones
Sleeping for 1
param1=1e-5,param2=ones
Sleeping for 1
param1=1e-2,param2=ones
Sleeping for 1
param1=1e-4,param2=ones
Sleeping for 2
param1=1e-4,param2=random
Sleeping for 2
param1=1e-6,param2=random
Sleeping for 4
param1=1e-2,param2=random
Sleeping for 3
param1=1e-3,param2=random
Sleeping for 4
param1=1e-5,param2=random
Sleeping for 5
param1=1e-3,param2=ones
Sleeping for 5
还有许多其他开关和参数:
[parallel --dry-run ...
将向您显示它将执行的操作,而实际上并未执行任何操作
parallel --eta ...
为您提供“预计到达时间”
parallel --bar ...
为您提供进度条parallel -k ...
保持顺序输出parallel -j 8 ...
一次运行8个作业,而不是默认情况下每个CPU内核1个作业]parallel --pipepart ...
将在一个子进程之间分割大量文件的内容]还请注意,GNU Parallel可以在网络中的其他计算机之间分配工作,并且失败并重试处理,输出标记等...