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

问题描述 投票:0回答:1

我正在使用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
linux bash jobs
1个回答
0
投票

如评论中所述,您可能要考虑使用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可以在网络中的其他计算机之间分配工作,并且失败并重试处理,输出标记等...

© www.soinside.com 2019 - 2024. All rights reserved.