如何在脚本中运行bash命令,而脚本的其余部分不必等待单个bash命令完成执行

如何在脚本中运行bash命令,而脚本的其余部分不必等待单个bash命令完成执行,bash,multithreading,shell,Bash,Multithreading,Shell,我正在脚本中运行一个循环,并且脚本中有一个单独的命令需要很长时间才能运行。当循环运行时,由于单个命令的原因,需要很长时间才能完成。这个长命令需要执行所有其他代码。因此,我希望脚本继续运行,而不是等待单个长命令完成执行 互联网上的网站都说在长命令的末尾使用&符号来运行一个单独的线程。问题是,当我使用这个命令时,它会忽略它前面设置命令可用的行。不需要完成该命令,脚本的其余部分就可以工作。该链接显示了两幅图像。第一个显示期望的结果,第二个显示在长命令末尾使用&符号时的不良结果 下面是我正在使用的类似

我正在脚本中运行一个循环,并且脚本中有一个单独的命令需要很长时间才能运行。当循环运行时,由于单个命令的原因,需要很长时间才能完成。这个长命令需要执行所有其他代码。因此,我希望脚本继续运行,而不是等待单个长命令完成执行

互联网上的网站都说在长命令的末尾使用&符号来运行一个单独的线程。问题是,当我使用这个命令时,它会忽略它前面设置命令可用的行。不需要完成该命令,脚本的其余部分就可以工作。该链接显示了两幅图像。第一个显示期望的结果,第二个显示在长命令末尾使用&符号时的不良结果

下面是我正在使用的类似代码示例:

for ((i = 1 ; i <= $howeverManyUserWants ; i++)); do

rm '/path/to/temporaryFile.js'

sed s/codeToChange/randomNum <path/to/template > path/to/temporaryFile.js

node temporaryFile.js #this takes command takes a long time to run

rm  path/to/temporaryFile.js

done

for((i=1;i问题是,因为我不明白您想要在何时同步线程,在程序中的哪个点上实现什么。可以使用jobs命令等待作业完成。使用jobs命令,您还可以让系统一次运行所需的任意多个作业

我在这里为您提供了完整的解决方案,允许您设置机器上的线程数。因此,不会出现“雷霆”效应,因为一次运行的作业数量与系统中的线程数量相同:

#! /bin/bash

NUM_THREADS=4

for ((i = 1 ; i <= $howeverManyUserWants ; i++)); do
    while true
    do
        CNT=$(jobs -p | wc -l)
        if [[ $CNT -lt $NUM_THREADS ]]; then

                echo "($i from $howeverManyUserWants)"
                {
                        sed s/codeToChange/randomNum < path/to/template > path/to/temporaryFile$i.js
                        node temporaryFile$i.js
                        rm -f path/to/temporaryFile$i.js
                } &
                break
        fi
    done
done
!/bin/bash
线程数=4
对于((i=1;i路径/to/temporary文件$i.js)
节点临时文件$i.js
rm-f path/to/temporaryFile$i.js
} &
打破
fi
完成
完成

从表面上看,这个问题要求对长时间运行的作业进行多次并行迭代,以节省执行时间。作业本身似乎是一个模拟,每次迭代使用不同的随机数(s…randomNum)。从OP中,不可能知道该作业的资源是什么

当前代码的一个问题是它重复使用同一个临时文件。如果在rm执行之前节点引擎无法读取临时文件,则可能会产生计时问题

可能的解决办法:


for ((i = 1 ; i <= $howeverManyUserWants ; i++)); do
{
    sed s/codeToChange/randomNum <path/to/template > path/to/temporaryFile-$i.js
    node temporaryFile$i.js #this takes command takes a long time to run
    rm -f path/to/tempporaryFile$i.js
} &
sleep 1
done


为了((i=1;i为什么你否决了答案,我为你提供了问题的最佳解决方案,如果你有大量文件要处理,上面的dash-o解决方案将不起作用,它会耗尽资源,更重要的是,它会导致睡眠性能下降1我无法评论你被否决的原因。至于你对解决方案的评论我贴的帽子:睡眠是为了缓解“雷声”效果,因为OP要求同时启动所有作业。通常“节点”作业会占用源资源来启动,但通常资源很少,因为它们会向其他服务发送调用。非常感谢!我应该对循环本身进行多线程处理。也感谢睡眠来阻止雷电效应。@JustinGeisen欢迎您。还想建议,如果您有大量的工作可能会压倒系统,那么考虑使用<代码> XARGS或<代码>并行< /代码>或类似的方式来覆盖并发作业的数量。