2017-02-14 12 views
0

У меня есть несколько сценариев нагрузки 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 Run тоже, который выглядит следующим образом:

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 & 

Если я запускаю их по отдельности, они бы выполняются в фоновом режиме и параллельно.

Но как автоматизировать это или написать сценарий, который будет вызывать оба этих сценария один за другим и будет ждать окончания первого, прежде чем перейти к следующему сценарию?

Спасибо заранее.

+0

Что случилось с 'data_load.sh; Read_test.sh'? –

+0

Он не дожидается завершения data_load и запускает Read_test.sh. –

+1

Добавьте 'wait' в конец' data_load.sh' –

ответ

0

Вы можете использовать xargs в параллельном режиме.

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

Эта команда говорит конвейеру «взять inpiped вход, шелушиться одну вещь в то время, в 4 нити, и эхо его со строкой„картофельный“.»

Существует также GNU Parallel, к которым некоторые люди клянутся - хотя кривая обучения и факт, что это не лучше, чем xargs для моих случаев использования (и тот факт, что он не установлен заранее на моем дистрибутиве) я от изучения слишком много об этом.

+0

Не могли бы вы рассказать мне, что нужно сделать в моем случае? Как запустить два сценария, которые содержат несколько команд параллельно? Thanks –

0

я буду подробно останавливаться на ответ есть р в:

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 запускает три команды нагрузки параллельно, затем, после этих трех финишей, второй запускает три команды чтения параллельно.

1

Вы можете изменить свой первый сценарий, чтобы иметь wait в конце, или вы можете иметь родительский сценарий source первый сценарий и wait.

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

По source -ную ребенка сценарий, рабочие места, которые он создает на самом деле будет работы основного сценария, что позволяет wait для них.

wait встроенный без аргументов будет ждать, пока все фоновые задания не выполняются, после чего выполнение переходит к следующей команде

+0

Спасибо @grisha Levit. Команда wait работает отлично и решает мою проблему. –