2015-07-11 6 views
2

Я хочу иметь сценарий оболочки, который настраивает несколько вещей, а затем вызывает два других сценария оболочки. Я хочу, чтобы эти два сценария выполнялись параллельно, и я хочу иметь возможность получать и распечатывать их живые выходы. Вот мой первый скрипт, который вызывает другие дваЗапустите два сценария оболочки параллельно и запишите их вывод

#!/bin/bash 
#CONFIGURE SOME STUFF 
$path/instance2_commands.sh 
$path/instance1_commands.sh 

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

ответ

5

Запуск обоих сценариев параллельно может выглядеть следующим образом:

#!/bin/bash 
#CONFIGURE SOME STUFF 
$path/instance2_commands.sh >instance2.out 2>&1 & 
$path/instance1_commands.sh >instance1.out 2>&1 & 
wait 

Примечания:

  • wait паузами до детей, instance1 и instance2, закончившие
  • 2>&1 на каждой строке перенаправляет сообщения об ошибках к соответствующему выходному файлу
  • & at конец строки заставляет основной скрипт продолжать работать после форкирования, тем самым создавая ребенка, который выполняет эту строку сценария одновременно с остальной частью основного сценария
  • каждый скрипт должен отправить свой вывод в отдельный файл. Отправка обоих файлов в один и тот же файл будет визуально грязной и невозможной для сортировки, когда экземпляры генерируют похожие выходные сообщения.
  • вы можете попытаться прочитать выходные файлы, пока скрипты работают с любым считывателем, например. less instance1.out Однако выход может застревать в буфере, а не обновляться. Чтобы исправить это, программам пришлось бы открыть stdout в режиме буферизации или без буфера. Кроме того, вы можете использовать -f или > для обновления дисплея.

Пример D из article on Apache Spark and parallel processing on my blog обеспечивает аналогичный скрипт для вычисления суммы ряда для Pi на все сердечник, учитывая программу С для вычисления суммы на одном ядре. Это немного выходит за рамки вопроса, но я упоминаю его, если вы хотите увидеть более глубокий пример.

1

Вполне возможно, изменить сценарий, чтобы выглядеть следующим образом:

#!/bin/bash 
    #CONFIGURE SOME STUFF 
    $path/instance2_commands.sh >> script.log 
    $path/instance1_commands.sh >> script.log 

Они оба вывода в тот же файл, и вы можете смотреть этот файл, запустив:

tail -f script.log 

Если вы как вы можете вывести на 2 разных файла, если хотите. Просто измените каждый линг на вывод (>>) на второе имя файла.

+2

Если вы хотите запустить их параллельно, вам нужно положить амперсанд (&) в конец, например: $ path/instance2_commands.sh >> script.log & –

+1

Не записывайте их обоих в один и тот же файл. Координация выхода отсутствует. – Paul

0

Это как я в конечном итоге пишу его с помощью инструкции Павла.

source $path/instance2_commands.sh >instance2.out 2>&1 & 
source $path/instance1_commands.sh >instance1.out 2>&1 & 
tail -q -f instance1.out -f instance2.out --pid $! 
wait 
sudo rm instance1.out 
sudo rm instance2.out 

Мои журналы в двух процессов отличается, так что я не волнует, если не все вместе, поэтому я их все в одном файле.

Смежные вопросы