Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Can';找不到“jobs”命令列出的进程_Linux_Bash_Jobs - Fatal编程技术网

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…
    使输出保持有序
  • parallel-j8…
    一次运行8个作业,而不是默认的每个CPU核运行1个作业
  • 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