我有一些在后台运行的YCSB数据加载脚本
data_load.sh:
nohup ycsb load couchbase2 -s -P workloada -p couchbase.bucket=poc -threads 30 .. > load1_output.txt &
nohup ycsb load couchbase2 -s -P workloada -p couchbase.bucket=poc -threads 30 .. > load2_output.txt &
nohup ycsb load couchbase2 -s -P workloada -p couchbase.bucket=poc -threads 30 .. > load3_output.txt &
还有一些 YCSB 也运行脚本,如下所示:
Read_test.sh:
nohup ycsb run couchbase2 -s -P workloadc -p couchbase.bucket=poc -threads 30 .. > read1_output.txt &
nohup ycsb run couchbase2 -s -P workloadc -p couchbase.bucket=poc -threads 30 .. > read2_output.txt &
nohup ycsb run couchbase2 -s -P workloadc -p couchbase.bucket=poc -threads 30 .. > read3_output.txt &
如果我单独运行它们,它们将在后台并行运行。
但是如何自动化此操作或编写一个脚本,该脚本将一个接一个地调用这两个脚本,并等待第一个脚本完成,然后再转到下一个脚本?
提前谢谢。
您可以修改第一个脚本以在末尾添加wait
,也可以source
第一个脚本并wait
的父脚本。
source ./data_load.sh
wait
./Read_test.sh
通过source
子脚本,它创建的作业实际上将成为主脚本的作业,使您能够为它们wait
。
没有参数的内置wait
将等到所有后台作业完成,之后执行将继续执行下一个命令
您可以在并行模式下使用xargs
。
$ echo {1..4} | xargs -n1 -P 4 echo "potato"
potato 1
potato 4
potato 3
potato 2
这个管道命令说"获取输入的输入,一次剥下一件事,分成 4 个线程,然后用字符串'potato'回显它。
还有GNU Parallel,有些人发誓 - 尽管学习曲线和它在我的用例中并不比xargs好的事实(以及它没有预装在我的发行版上的事实(使我无法学习太多关于它的知识。
我将详细说明P的答案:
load_and_read.sh:
#!/bin/bash
load_commands='ycsb load couchbase2 -s -P workloada -p couchbase.bucket=poc -threads 30 .. > load1_output.txt
ycsb load couchbase2 -s -P workloada -p couchbase.bucket=poc -threads 30 .. > load2_output.txt
ycsb load couchbase2 -s -P workloada -p couchbase.bucket=poc -threads 30 .. > load3_output.txt'
echo "$load_commands" | xargs -P3
read_commands='ycsb run couchbase2 -s -P workloadc -p couchbase.bucket=poc -threads 30 .. > read1_output.txt
ycsb run couchbase2 -s -P workloadc -p couchbase.bucket=poc -threads 30 .. > read2_output.txt
ycsb run couchbase2 -s -P workloadc -p couchbase.bucket=poc -threads 30 .. > read3_output.txt'
echo "$read_commands" | xargs -P3
使用 nohup ./load_and_read.sh &
在后台运行整个脚本。 第一个echo "$cmds" | xargs -P3
并行运行三个加载命令,然后在这三个命令完成后,第二个并行运行三个读取命令。