wait in bash

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

avkhozov
Сообщения: 10
ОС: Debian "squeeze/sid"

wait in bash

Сообщение avkhozov »

Есть несколько процессов запущеных в бэкграунде. Есть ли возможность стандартными средствами баша отследить завершение первого из них ?
Стандартными — это то есть не проверяя периодически результаты jobs.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4463
Статус: GNU generation
ОС: Debian GNU/Linux

Re: wait in bash

Сообщение Rootlexx »

Цитирую man bash:
wait [n ...]
Wait for each specified process and return its termination sta‐
tus. Each n may be a process ID or a job specification; if a
job spec is given, all processes in that job’s pipeline are
waited for. If n is not given, all currently active child pro‐
cesses are waited for, and the return status is zero. If n
specifies a non-existent process or job, the return status is
127. Otherwise, the return status is the exit status of the
last process or job waited for.
Спасибо сказали:
avkhozov
Сообщения: 10
ОС: Debian "squeeze/sid"

Re: wait in bash

Сообщение avkhozov »

Можно пример ?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4463
Статус: GNU generation
ОС: Debian GNU/Linux

Re: wait in bash

Сообщение Rootlexx »

avkhozov писал(а):
17.05.2009 10:24
Можно пример ?

Код: Выделить всё

alexey@desktop:~$ for counter in $(seq 5 | tr '\n' ' '); do sleep 10s & done; wait %1
[1] 7325
[2] 7326
[3] 7327
[4] 7328
[5] 7329
[1]   Done                    sleep 10s
alexey@desktop:~$

Здесь запускаются несколько фоновых процессов, а затем происходит ожидание завершения первого из них (по номеру задания). Можно было сделать и немного по-другому:

Код: Выделить всё

sleep 10 &
wait_pid=$!        # В переменной $! хранится PID последней запущенной в фоне программы.
sleep 10 &
wait $wait_pid
Спасибо сказали:
avkhozov
Сообщения: 10
ОС: Debian "squeeze/sid"

Re: wait in bash

Сообщение avkhozov »

Спасибо, но я видимо некоректно написал задачу. Нужно несколько другое.
В бэкграунде запускаются например 4 процесса на 4 ядерной машине. Требуется
определить какой процесс первый по времени завершился, чтобы запустить
на свободном ядре новую задачу.
Видимо кроме того как периодически смотреть jobs это не сделать.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: wait in bash

Сообщение NickLion »

А почему не запустить в фоне 4 скрипта, каждый из которых будет ждать свою задачу, и в случае окончания ее работы будет запускать новую?
очень приблизительно:
waiter.sh

Код: Выделить всё

for/while... job &; wait ...

main.sh

Код: Выделить всё

waiter.sh param1 &
waiter.sh param2 &
waiter.sh param3 &
waiter.sh param4 &
Спасибо сказали:
avkhozov
Сообщения: 10
ОС: Debian "squeeze/sid"

Re: wait in bash

Сообщение avkhozov »

Можно и так. Спасибо. Хотя в таком случае непонятно, как изначально разбить задачи по процессорам.
Время их выполнения не известно. Три могут быстро отработать, а у последнего еще 10 задач останется...
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4463
Статус: GNU generation
ОС: Debian GNU/Linux

Re: wait in bash

Сообщение Rootlexx »

avkhozov писал(а):
17.05.2009 22:01
Видимо кроме того как периодически смотреть jobs это не сделать.

Ну почему именно jobs? Я ведь показал, как определить PID только что запущенного фонового задания оболочки. Вот за этими PID и можно следить.
Спасибо сказали:
avkhozov
Сообщения: 10
ОС: Debian "squeeze/sid"

Re: wait in bash

Сообщение avkhozov »

Я думаю что быстрее будет в `jobs -p` посмотреть, чем ps. Хотя принципиальной разницы нет.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: wait in bash

Сообщение watashiwa_daredeska »

avkhozov писал(а):
18.05.2009 09:24
в таком случае непонятно, как изначально разбить задачи по процессорам.
А их не надо разбивать заранее. Сложить задачи в файл, прикрыть его lock-файлом (я пользуюсь dotlockfile из пакета liblockfile1 в Debian) и организовать очередь/стек/что еще в этом файле.
Спасибо сказали:
avkhozov
Сообщения: 10
ОС: Debian "squeeze/sid"

Re: wait in bash

Сообщение avkhozov »

watashiwa_daredeska писал(а):
18.05.2009 14:10
А их не надо разбивать заранее. Сложить задачи в файл, прикрыть его lock-файлом (я пользуюсь dotlockfile из пакета liblockfile1 в Debian) и организовать очередь/стек/что еще в этом файле.

Да так удобнее, спасибо.
Спасибо сказали: