0

我有一些在后台运行的 YCSB 数据加载脚本

数据加载.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 &

如果我单独运行它们,它们将在后台并行运行。

但是如何自动执行此操作或编写一个脚本,该脚本将一个接一个地调用这两个脚本并等待第一个脚本完成,然后再转到下一个脚本?

提前致谢。

4

3 回答 3

1

You can either modify your first script to have a wait at the end, or you can have a parent script source the first script and wait.

source ./data_load.sh
wait
./Read_test.sh

By source-ing the child script, jobs that it creates are actually going to be jobs of the main script, enabling you to wait for them.

不带参数的wait内建函数将等待所有后台作业完成,之后执行将继续执行下一个命令

于 2017-02-14T08:24:02.770 回答
0

我将详细说明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并行运行三个加载命令,然后,在这三个完成后,第二个并行运行三个读取命令。

于 2017-02-14T08:00:47.763 回答
0

您可以xargs在并行模式下使用。

$ echo {1..4} | xargs -n1 -P 4 echo "potato"
potato 1
potato 4
potato 3
potato 2

这个管道命令说“接受管道输入,一次剥离一件事,分成 4 个线程,并用字符串 'potato' 回显它。”

还有一些人发誓的GNU Parallel ——尽管学习曲线和它在我的用例中并不比 xargs 好(而且它没有预装在我的发行版上的事实)让我无法学习太多了。

于 2017-02-14T07:08:27.393 回答