假设我有三个(或更多)bash 脚本:script1.sh
、script2.sh
和script3.sh
。我想调用所有这三个脚本并运行它们平行线。一种方法是执行以下命令:
nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &
(一般来说,脚本可能需要几个小时或几天才能完成,所以我想使用它们,nohup
以便即使我的控制台关闭它们也能继续运行。)
但是,有什么办法可以执行这三个命令吗?平行线与一个单身的称呼?
我在想类似的事情
nohup bash script{1..3}.sh &
但这似乎是按顺序执行script1.sh
、script2.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 附带了huponexit
as 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" &"
或者转念一想,也许不是