4

我想从目录运行所有脚本。像 ,

该目录包含 40 个脚本,我想并行运行前 5 个脚本。完成这些脚本后,接下来的 5 个脚本将与剩余的一样执行。

请使用linux和perl命令给出任何解决方案

4

6 回答 6

10

每个人都喜欢重新发明并行执行工具。

于 2012-06-19T10:01:21.557 回答
2

前 5 个脚本可以使用nohup吗?让第 5 个脚本写入已完成的某个文件并继续。

于 2012-06-19T09:52:08.610 回答
1

当您在包含脚本的文件夹中时,运行此 bash 脚本/命令:

for var in $(ls *.pl)
do
    $var &
    # 5 simultaneous jobs 
    while test "$(jobs |wc -l)" -gt 4 
    do
        sleep 1
    done
done

这取决于您没有运行其他后台作业,通过在命令行上编写“作业”来测试它。

于 2012-06-19T09:58:52.133 回答
1

不要忘记 GNU Make!使用这样的生成文件并使用 -j 选项运行。见http://www.gnu.org/software/make/manual/make.html#Parallel

scripts=$(wildcard *.sh)
all: $(patsubst %.sh,%.out,$(scripts))
%.out: %.sh
    sh $< > $@ 2>&1

如果您在 Perl 中工作,我建议您使用Parallel::ForkManager

哦,Linux 上的 xargs 似乎有一个 -P 选项来并行运行作业。我没有使用它,因为我的 GNU Make 技巧早于它。

于 2012-06-19T15:12:13.893 回答
0
You can write sth like below. It's pseudo code.

#!/bin/ksh

dir=$1
count=0
for script in $1/*
  do
   count++
   $i &
   add the pid to pidList array
   if( count==5){
     while(waitforProcessComplete(pidList){
     }
   }

  done
于 2012-06-19T10:40:48.760 回答
0

我更喜欢 GNU 并行。它既简单又有趣——文档附带了许多简洁的示例。

最大的优势:您无需编写任何代码或 Makefile 即可运行您的脚本。例子:

# create the example scripts:
mkdir scripts
for i in {1..50}; do {echo '#!/bin/sh'; echo "echo $i"; echo "sleep 1" } > scripts/s$i.sh; done

# use parallel to run all these scripts, 5 at a time:
parallel -j 5 ::: scripts/*.sh
于 2012-06-19T19:24:56.743 回答