这是我的问题:
我有 100 个随着时间的推移创建的 perl 脚本;每个脚本都需要自己的时间——从 5 分钟到 5 小时。
今天,我正在命令提示符下按顺序运行所有这些脚本作为一个套件,运行所有这些脚本需要将近 1.5 天。
我想知道是否可以同时打开 100 个命令提示符,以及是否可以在每个命令提示符上并行运行一个 perl 脚本……所以我的所有脚本都可以在 5 小时内完成(单个脚本所需的最长时间)。
这可以通过任何工具实现吗?
我们可以使用多线程来实现上述吗?
请建议什么是更好的方法?
这是我的问题:
我有 100 个随着时间的推移创建的 perl 脚本;每个脚本都需要自己的时间——从 5 分钟到 5 小时。
今天,我正在命令提示符下按顺序运行所有这些脚本作为一个套件,运行所有这些脚本需要将近 1.5 天。
我想知道是否可以同时打开 100 个命令提示符,以及是否可以在每个命令提示符上并行运行一个 perl 脚本……所以我的所有脚本都可以在 5 小时内完成(单个脚本所需的最长时间)。
这可以通过任何工具实现吗?
我们可以使用多线程来实现上述吗?
请建议什么是更好的方法?
代替:
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 答案。
如果需要定期运行这些多个脚本,则应考虑编写调用它们的 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你只需要指定实际的依赖项。
并行启动脚本很容易。
在 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