【发布时间】:2020-02-19 23:55:22
【问题描述】:
我正在使用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
【问题讨论】:
-
echo $(jobs -p)是对echo的无用用法。只需jobs -p。我认为在脚本中您必须使用set -m或set +m启用作业控制。像xargs -P"$max_cnt" bash -c 'job "$@"'这样使用xargs是一种并行工作的简单方法 -
请参阅stackoverflow.com/a/356154/14122,了解不使用
jobs跟踪后台进程的示例。wait命令返回它正在等待的作业的退出状态,因此可以跟踪哪些单个作业成功和失败;如果在wait之后添加unset "pids[$i]",则还可以计算已开始但尚未收获的作业数量可供检查。 -
考虑使用 GNU Parallel 来并行运行作业。如果您希望一次运行 8 个作业,
parallel -j8 < ListOfJobs.txt -
你不需要。 GNU Parallel 将为您完成。
parallel echo ::: a b c ::: 1 2 3相当于在 a,b,c 和 1,2,3 上嵌套的for循环 -
GNU Parallel 可以根据 CPU 负载或内存压力为您决定调度,并在多个服务器之间分配负载,处理故障/重启,标记输出,并显示进度米...只是说。