Linux Can';找不到“jobs”命令列出的进程
我正在使用Linux Can';找不到“jobs”命令列出的进程,linux,bash,jobs,Linux,Bash,Jobs,我正在使用jobs命令来控制计算密集型进程的数量。我不希望一次运行超过max_cnt个进程,并且只在所有进程都已停止时停止 我使用下面的bash脚本来实现这一点。然而,这段代码总是将一个进程列为正在运行,即使在一切都已执行并停止之后也是如此 此外,我在htop的流程列表中找不到该流程。我应该做什么,或者在哪里查找由echo$(jobs-p)命令的结果列出的进程,以及如何解决即使一切停止也不退出的问题 #!/usr/bash SLEEP=5 max_cnt=8 # generate a ran
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并行< /强>,这使得管理并行作业时更容易。您的代码可能如下所示:
#!/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…
一次运行8个作业,而不是默认的每个CPU核运行1个作业parallel-j8…
,它将在子进程之间分割大量文件的内容parallel--pipepart…
还请注意,GNU Parallel可以在网络中的其他机器之间分配工作,它具有失败和重试处理、输出标记等功能。
echo$(jobs-p)
是对echo的无用使用。只需作业-p
。我认为在脚本中,必须使用set-m
或set+m
启用作业控制。使用xargs
类似xargs-P“$max_cnt”bash-c'job“$@”
是一种简单的方法,可以并行化工作对象,例如跟踪后台进程而不使用作业。wait
命令返回它正在等待的作业的退出状态,因此可以跟踪哪些作业成功或失败;如果添加了<代码>未设置的“pID[$i]” > <代码>等待>代码>之后,我们还将计算开始的作业数量,但尚未获得可用的检查次数。考虑使用GNU并行运行并行作业。如果您希望一次运行8个作业,则无需执行并行-j8
。GNU Parallel会帮你做的parallel echo:::a b c:::1 2 3
相当于a、b、c和1,2,3GNU上的嵌套循环,并行可以根据CPU负载或内存压力决定调度,并在多个服务器之间分配负载,处理故障/重启、标记输出和显示进度表。。。只是说说而已,谢谢<代码>并行
很有趣,几乎解决了我的问题。然而,我仍然很好奇这份工作没有被列出,所以我会在接受这个解决方案之前等待。哪份工作没有被列出?您可能希望使用parallel-k…
来保持输出的有序性,以便检查输出。请参阅本期“此外,我找不到htop进程列表中列出的进程…”<代码>并行很好,我想通过我对作业的理解来理解问题-p