LINUX.ORG.RU

как определить успешное завершение работы скриптов запущеных в фоне

 


0

1

Есть bash скрипт который запускает 6 других скриптов параллельно в фоне через & но при этом скрипт завершает свою работу а запущенные скрипты ещё работают, мне же нужно дождаться успешного завершения работы скриптов и продолжить выполнение основного скрипта. Как определить успешное завершение работы скриптов запущенных в фоне ?

С помощью $! получаешь pid процесса и ждёшь, пока этот процесс завершится.

Black_Shadow ★★★★★
()
Ответ на: комментарий от zolden

Сто процентов что не так ,иначе не задавал бы вопрос. Хорошо , попробую описать задачу подробнее. Сейчас я запускаю bash скрипт который запускает nodejs. Результатом работы nodejs является sql файл который отправляется в mysql.

Так как работа nodejs занимает продолжительное время (13 минут) мне это не приемлемо, я решил уменьшить временные затраты и решил запустить паралельно 6 копий nodejs но мне важно когда все скрипты завершат работу собрать результирующий sql файл и одним insertom записать в базу. Почему именно так, а не средствами js, или каждая копия nodejs скрипта пусть пишет в базу. Потому что nodejs знаю хуже чем bash, потому что всегда так делал ,но не претендую на самое оптимальное решение. Вот так выглядит мой велосипед сейчас :

основной bash скрипт run.sh запускает 6 скриптов 1.sh … 6.sh

1.sh & 2.sh & 3.sh & 4.sh & 5.sh & 6.sh &

в каждом скрипте 1.sh … 6.sh

node app.js

вот как то так

Уверен что есть изящные решения, подскажите кто как решал бы эту задачу.

oleg410
() автор топика
Ответ на: комментарий от oleg410

Так как работа nodejs занимает продолжительное время (13 минут) мне это не приемлемо, я решил уменьшить временные затраты и решил запустить паралельно 6 копий nodejs

Ловите менеджера!

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от biglpfan

Да , отличаются только входным массивом

oleg410
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Информация в этих скриптах есть мониторинг устройств и если цикл обновления больше 5 минут то ее сложно назвать real-time. Уважаю сарказм.

oleg410
() автор топика

Запускатель:

pinkbyte@oas1 ~/1 $ cat main.sh
#!/bin/bash
echo "Timestamp before start: $(date)"

./worker1.sh &
PID1=$!
echo "First worker PID: ${PID1}"

./worker2.sh &
PID2=$!
echo "Second worker PID: ${PID2}"

while true; do
        wait -n -p CPID
        RES=$?
        # CPID would be empty if all workers are exited
        [[ -z ${CPID} ]] && break
        echo "Process with ID ${CPID} is completed with return status ${RES}"
done

echo "Timestamp after end: $(date)"

Worker-ы:

pinkbyte@oas1 ~/1 $ cat worker1.sh
#!/bin/bash
sleep 5
pinkbyte@oas1 ~/1 $ cat worker2.sh
#!/bin/bash
sleep 3
exit 1

Результат:

Timestamp before start: Вс 17 июл 2022 15:53:22 MSK
First worker PID: 25925
Second worker PID: 25926
Process with ID 25926 is completed with return status 1
Process with ID 25925 is completed with return status 0
Timestamp after end: Вс 17 июл 2022 15:53:27 MSK

Дальше сам...

Pinkbyte ★★★★★
()

Спасибо всем огромное !!! Всё разрешил.


./m1.sh & # запуск в фоновом режиме
echo $!>1.pid
echo 'start m1.sh '`date "+%Y-%m-%m %T"` >> time.txt
pids+=($!) # добавляем pid в массив

./m2.sh &
echo $!>2.pid
echo 'start m2.sh '`date "+%Y-%m-%m %T"` >> time.txt
pids+=($!)

./m3.sh &
echo $!>3.pid
echo 'start m3.sh '`date "+%Y-%m-%m %T"` >> time.txt
pids+=($!)

./m4.sh &
echo $!>4.pid
echo 'start m4.sh '`date "+%Y-%m-%m %T"` >> time.txt
pids+=($!)

./m5.sh &
echo $!>5.pid
echo 'start m5.sh '`date "+%Y-%m-%m %T"` >> time.txt
pids+=($!)

./m6.sh &
echo $!>6.pid
echo 'start m6.sh '`date "+%Y-%m-%m %T"` >> time.txt
pids+=($!)

# дожидаемся успешного завершения всех фоновых процессов
for pid in ${pids[@]}; do
        wait $pid
        if [ $? -ne 0 ]; then
                echo Выходим из скрипта если получим ошибку
                exit 1
        fi
done

echo Выполняем дальше скрипт

oleg410
() автор топика
Ответ на: комментарий от zolden

Если нужно выполнять одну команду - безусловно можно попробовать свернуть всё в xargs. Но если нужно выполнить разный набор команд на разные worker-ы или логика какая-нибудь нетривиальная, то стремление к сведению в однострочник может закончиться write-only кодом.

К которому только комментариев придется вагон и тележку написать ради того, чтобы через полгода увидев этот однострочник не охренеть от того что уже ничерта не помнишь что он делает :-)

Pinkbyte ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.