我想从目录运行所有脚本。像 ,
该目录包含 40 个脚本,我想并行运行前 5 个脚本。完成这些脚本后,接下来的 5 个脚本将与剩余的一样执行。
请使用linux和perl命令给出任何解决方案
前 5 个脚本可以使用nohup吗?让第 5 个脚本写入已完成的某个文件并继续。
当您在包含脚本的文件夹中时,运行此 bash 脚本/命令:
for var in $(ls *.pl)
do
$var &
# 5 simultaneous jobs
while test "$(jobs |wc -l)" -gt 4
do
sleep 1
done
done
这取决于您没有运行其他后台作业,通过在命令行上编写“作业”来测试它。
不要忘记 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 技巧早于它。
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
我更喜欢 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