调用多个 bash 脚本并并行运行它们,而不是按顺序运行

调用多个 bash 脚本并并行运行它们,而不是按顺序运行

假设我有三个(或更多)bash 脚本:script1.shscript2.shscript3.sh。我想调用所有这三个脚本并运行它们平行线。一种方法是执行以下命令:

nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &

(一般来说,脚本可能需要几个小时或几天才能完成,所以我想使用它们,nohup以便即使我的控制台关闭它们也能继续运行。)

但是,有什么办法可以执行这三个命令吗?平行线与一个单身的称呼?

我在想类似的事情

nohup bash script{1..3}.sh &

但这似乎是按顺序执行script1.shscript2.sh、 和script3.sh,而不是并行执行。

答案1

for((i=1;i<100;i++)); do nohup bash script${i}.sh & done

答案2

更好的方法是使用GNU 并行。 GNU 并行很简单,通过它我们可以控制并行运行的作业数量,并对作业进行更多控制。

在下面的命令中,script{1..3}.sh被扩展并作为参数并行发送bash。这里-j0表示应该运行尽可能多的作业。默认情况下,parallel一个 cpu 核心运行一项作业。

$ parallel -j0 bash :::: <(ls script{1..3}.sh)

你也可以尝试使用

$ parallel -j0 bash ::: script{1..3}.sh

在执行第二种方法时,如果收到任何错误消息,则意味着该--tollef选项已设置/etc/parallel/config并且需要删除,并且一切都会正常工作。

您可以阅读GNU Parallels手册页这里以获得更丰富的选择。

如果您从远程计算机运行作业,最好使用screen以便会话不会由于网络问题而关闭。nohup没有必要,因为最新版本的 bash 附带了huponexitas off,这将阻止父 shellHUP在退出期间向其子 shell 发送信号。如果它没有取消设置,请执行以下操作:

$ shopt -u huponexit  

答案3

我们还可以用来xargs并行运行多个脚本。

$ ls script{1..5}.sh|xargs -n 1 -P 0 bash

这里每个脚本都作为参数分别传递给 bash。-P 0表示并行进程数可以尽可能多。使用 bash default 也更安全job control feature (&)

答案4

如果您想节省一些打字工作

eval "nohup bash "script{1..3}.sh" &"

或者转念一想,也许不是

相关内容