Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > bash запуск несколько процессы дождаться всех


Автор: DukeCpp 2.5.2009, 22:33
Уважаемые участники форума, здравствуйте!

собственно, сабж;
Искал по форуму по указанным ключевым словам; найти ответов, к сожалению, не удалось. 
Господа, обращаюсь к вам.

хочу написать скрипт на баше, который будет запускать несколько процессов одновременно, а по окончании последнего из запущенных (не раньше!) продолжить делать действия.
сейчас это делается в два скрипта:
runApps.sh:
Код

./myApp -name "myName" &
./myApp -data "someOtherData" &


они делают вычисления, в процессе которых пишут файлы. Когда всё отработало, я запускаю файл что-то типа:

Код

cat ProcessedData1.txt ProcessedData2.txt >> ProcessedDataResults.txt


Это упрощённая схема: окончание каждого запущенного myApp зависит от внешних факторов, поэтому тот процесс, который был запущен ранее, хоть на 2 дня, может завершиться последним, и его тоже надо дождаться, прежде чем процессить ProcessedDataResults.txt
 
Вопрос: 

Как избежать ручной работы и самостоятельного мониторинга процессов и возложить всё это на bash? 
Заране благодарен за содействие!

Автор: powerfox 3.5.2009, 00:10
Код

./myApp -name "myName" &
pid1=$!
./myApp -data "someOtherData" &
wait $! #Wait second process
wait $pid1


Автор: Vaulter 3.5.2009, 00:13
погрешность в секунду определения живости по PID:

Код


check_process_pid()
{
    local pid=$1
# If the process has already failed, which sometimes happens, then kill will return 1.
    if kill -0 $pid > /dev/null 2>&1 ; then 
        return 0;
    fi
    
#    echo "DEAD" >> ${PROCESS_STATUS_FILE}
    return 1
}

#echo -n "Stopping process $PID..."
#            kill $PID
            #constant quering
            local t=10 #10 secs
            while [ 0 -lt $t ] && check_process_pid $PID; do echo -n "."; sleep 1; let t=t-1; done

echo "PROCESS $PID DEAD";



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

Автор: nickless 3.5.2009, 00:24
Код

#!/bin/bash

echo start

(echo "sleep two"; sleep 2; echo two) &
(echo "sleep one"; sleep 1; echo one) &
(echo "sleep three"; echo three) &

echo "before wait, jobs:"
jobs -lp

wait

echo end


Добавлено через 2 минуты и 15 секунд
Хех, когда вы успели smile 

Автор: bilbobagginz 3.5.2009, 07:52
DukeCpp, в принципе кончено в bash существует команда wait.
т.е. в главном скрипте запускаешь свои джобы, и собираешь их pidы.:
допустим у тебя есть скрипты вычислений. calc[1...N].sh, N=10
делаешь:
Код

PIDS=""
I=1
LIM=10
while [ $I -le $LIM ]
do
  ./calc${I}.sh &
  if [ -z $PIDS ]; then
    PIDS="$!"
  else
    PIDS="${PIDS} $!"
  fi
  I=$(( $I + 1 )
done
# внимание: постой паровоз, не спешите колёса:
wait ${PIDS}
# wait - будет ждать выхода всех pid-ов из списка PIDS
# и тут уже можно запустить скрипт "сборки" gatherdata.sh:
./gatherdata.sh

воть, однако это всё очень ограничено, и не берёт в счёт различные комбинации, а также ограничено на 1 компьютер (ну не совсем, но всё же)

Цитата(DukeCpp @  2.5.2009,  22:33 Найти цитируемый пост)
Как избежать ручной работы и самостоятельного мониторинга процессов и возложить всё это на bash? 
Заране благодарен за содействие!

для того, что вы делаете существуют специальные пакеты ПО.
это называется job scheduling management.
я знаю точно, что такую задачу смогут сделать"
  • http://www.cs.wisc.edu/condor
  • http://en.wikipedia.org/wiki/Platform_LSF
  • http://en.wikipedia.org/wiki/Portable_Batch_System - тебя интересует бесплатная версия "openpbs"
"лично знаком" только с первым вариантом, но он очень удобен (по-моему), и хорошо работает на нескольких системах (linux, windows, solaris, mac, freebsd, и более ), и позволит тебе заюзать все "свободные" компы, напр. минут 20 после того, как они не использовались локально. 

тебя интересует конфигурация DAG (т.е. directed acyclic graph). такая конфигурация позволяет запустить несколько зависимых групп независимых подзадач. вот мануал основной:
http://www.cs.wisc.edu/condor/manual/v7.2/
(скачай сам пакет, потом пройдись по установке, и фокусируйся на user manual)

вот еще ссылки на самоучитель:
http://homepages.nesc.ac.uk/~gcw/NGS/Condor.html
http://homepages.nesc.ac.uk/~gcw/NGS/Condor2.html

Люди пользовавшиеся LSF свидетельствуют о том, что эта система "лучше" чем кондор, 
но с ней могут быть проблемы с лицензией, т.к. это чисто коммерческий продукт. Лучше она в том, что кондор работает по принципу оппортунизма, а LSF гибче и может работать как с оппортунистическими ресурсами, так и со специально выделенными.

удачи.

Автор: DukeCpp 3.5.2009, 15:48
вот это даsmile

powerfox
да-с, всё гениальное просто. Расширить циклом уже смогу;) Благодарю! 

Vaulter,
Код

let t=t-1
 
это, как я понимаю причина погрешности в секунду? То есть дату процессить начнём с самым большим опозданием в секунду после заврешнеия последнего, так?
Ну, на самом деле, погрешность чисто символическая, если учесть, что процессы выполняются от десятков минут. 
Спасибо за просто готовый ответ!

nickless
Да! Большое спасибо-с! Именно.
Код

jobs -lp


я так понял, что оно собирает PID-ы всех запущенных этим скриптом процессов? А wait ждёт всех процессов, которые были "даны свыше"?

bilbobagginz

Великоблагодарю за столь исчерпывающий ответ. В мемориз, однозначно; когда подойду к задаче более сложной диспетчирезации и расрпределения задач, обязательно взгляну lsf и PBS. Пока что совершенно удовлетворён предложенными решениями на bash/Perl, ну а после -- condor, как-то подружественнее показалсяsmile


Вопрос помечаю решённым.
Товарищи, Благодарю! 

Автор: bilbobagginz 3.5.2009, 16:40
Цитата(DukeCpp @  3.5.2009,  15:48 Найти цитируемый пост)
bash/Perl

это всё на баше, просто пока нет синтаксис-подсветки для баша, юзаю перловую подсветку.
кондор однозначно рекомендую: на изучения нужно всего 1-2 часика. очень прост, и его элементарно можно настроить в любой лаборатории, заюзав этим все ресурсы.
(там только надо чтобы сеть была настроена корректно: dns (direct/reverse), time, желательно иметь какой-то единый юзеровый домен - ldap/nis)

конечно если лень прогу править почаще, то лучше всё запускать на 1-м компе, и говорить своему ректору "запустил, пока бежит, когда будут новости - сообщу".
но если жалко времени жизни, то подход меняется  smile 











Автор: nickless 4.5.2009, 18:21
Цитата(DukeCpp @  3.5.2009,  14:48 Найти цитируемый пост)
я так понял, что оно собирает PID-ы всех запущенных этим скриптом процессов? А wait ждёт всех процессов, которые были "даны свыше"?

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)