2

这是我的问题:

我有 100 个随着时间的推移创建的 perl 脚本;每个脚本都需要自己的时间——从 5 分钟到 5 小时。

今天,我正在命令提示符下按顺序运行所有这些脚本作为一个套件,运行所有这些脚本需要将近 1.5 天。

我想知道是否可以同时打开 100 个命令提示符,以及是否可以在每个命令提示符上并行运行一个 perl 脚本……所以我的所有脚本都可以在 5 小时内完成(单个脚本所需的最长时间)。

这可以通过任何工具实现吗?

我们可以使用多线程来实现上述吗?

请建议什么是更好的方法?

4

3 回答 3

4

代替:

perl script1
perl script2
...
perl script100

你可以做

perl script1 &
perl scipt2 &
 ...
perl script100       # no & here!

不过,这并不完全是多线程。

如果您拥有所有脚本,并且只有那些脚本位于专用目录(例如parscripts)中,则可以执行以下操作:

for s in parscripts/*.pl;do perl $s & ;done
wait
echo "All scripts completed."

但这当然前提是脚本是独立的!另请参阅@KlasLindbäcks 答案。

于 2013-11-12T12:31:02.667 回答
2

如果需要定期运行这些多个脚本,则应考虑编写调用它们的 shell 脚本。或者,我们可以编写一个makefile。

当各种脚本之间存在依赖关系时,应使用makefile,并且您需要表示“<em>foo需要在之前运行bar”。然后make程序将自动找到满足这些依赖关系的正确顺序。make您还可以指定将启动多少并行作业:make -j 4四个并行作业。

生成文件由具有依赖项和正文的接收方组成。在正文中,每一行都被视为一个 shell 命令。该命令将打印到终端,然后执行。要禁止打印,请在命令前加上@. 例子:

foo: bar something_else
<tab    >@ echo "I am about to execute the foo command:"
<tab    >perl /some/path/foo.pl

bar:
<tab    >@ echo "I am about to execute the bar:"
<tab    >perl /some/path/bar.pl

something_else
<tab    >perl /some/path/something.pl | perl /some/path/else.pl >/some/path/output.txt

<tab >必须更改为文字制表符。空格的意图不起作用。

这种解决方案的缺点是makefile 的长度是简单shell 脚本的三倍。优点是您可以直接指定需要多少并行作业(这可以在没有太多空闲的情况下提供均匀的负载),并且您不必像Klas Lindbäck在他的回答中提出的那样手动订购脚本。make你只需要指定实际的依赖项。

于 2013-11-12T14:03:42.130 回答
2

并行启动脚本很容易。

在 Linux/Unix 中,只需在每个命令的末尾添加一个 & 号即可在后台启动它。

例子:

myscript &

你需要注意两点:

有些脚本可能相互依赖,因此在其他脚本完成之前不应启动它们。

由于多个脚本并行运行时的瓶颈,总时间可能会超过 5 小时。

第一个问题是通过将依赖脚本组合到脚本文件中来解决的,例如您的启动脚本可能如下所示:

#!/bin/sh
perl script1 &
perl script2 &
script_group1 &
script_group2 &
...

脚本组看起来像这样:

#!/bin/sh
# Note that there is no '&' at the end of these lines,
# because they need to run consecutively:
perl dependentscript1 
perl dependentscript2
perl dependentscript3 
于 2013-11-12T12:43:41.310 回答