这是我的问题:
我有100个perl脚本随着时间的推移而创建;每个脚本都需要自己的时间 - 从5分钟到5个小时。
今天我以顺序方式从命令提示符运行所有这些脚本作为套件,运行所有脚本需要大约1.5天。
我想知道是否可以同时打开100个命令提示,如果我可以在每个命令提示符上并行运行一个perl脚本...所以我的所有脚本都可以在5个小时内完成(单个脚本占用的最长时间)
这可以通过任何工具实现吗?
我们可以使用多线程来实现上述目标吗?
请建议什么是更好的appraoch方式?
答案 0 :(得分: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回答。
答案 1 :(得分: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
答案 2 :(得分:2)
如果需要定期运行这些多个脚本,则应考虑编写一个调用它们的shell脚本。或者,我们可以编写一个makefile。
当各种脚本之间存在依赖关系时,应该使用makefile,并且需要表达“ foo
需要在bar
之前运行”。然后make
程序将自动找到满足这些依赖关系的正确顺序。您还可以指定make
将启动多少并行作业:make -j 4
,用于四个并行作业。
makefile由包含依赖项和正文的收件人组成。在正文中,每一行都被视为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脚本的三倍。优点是您可以直接指定所需的并行作业数量(这样可以在没有太多空闲的情况下提供均匀负载),并且您不必手动订购脚本,例如他的答案中提出的KlasLindbäck 。使用make
,您只需指定实际的依赖项。