gpt4 book ai didi

linux - 找不到 `jobs` 命令列出的进程

转载 作者:行者123 更新时间:2023-12-03 09:58:36 26 4
gpt4 key购买 nike

我正在使用 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 ...保持输出有序
  • parallel -j 8 ...一次运行 8 个作业,而不是默认的每个 CPU 内核 1 个作业
  • parallel --pipepart ...这将跨子进程拆分大文件的内容

  • 另请注意,GNU Parallel 可以在您网络中的其他机器之间分配工作,并且它具有失败和重试处理、输出标记等...

    关于linux - 找不到 `jobs` 命令列出的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60311034/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com