Есть несколько процессов запущеных в бэкграунде. Есть ли возможность стандартными средствами баша отследить завершение первого из них ?
Стандартными — это то есть не проверяя периодически результаты jobs.
wait in bash
Модераторы: /dev/random, Модераторы разделов
-
- Бывший модератор
- Сообщения: 4463
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: wait in bash
Цитирую 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.
-
- Бывший модератор
- Сообщения: 4463
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: wait in bash
Код: Выделить всё
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
-
- Сообщения: 10
- ОС: Debian "squeeze/sid"
Re: wait in bash
Спасибо, но я видимо некоректно написал задачу. Нужно несколько другое.
В бэкграунде запускаются например 4 процесса на 4 ядерной машине. Требуется
определить какой процесс первый по времени завершился, чтобы запустить
на свободном ядре новую задачу.
Видимо кроме того как периодически смотреть jobs это не сделать.
В бэкграунде запускаются например 4 процесса на 4 ядерной машине. Требуется
определить какой процесс первый по времени завершился, чтобы запустить
на свободном ядре новую задачу.
Видимо кроме того как периодически смотреть jobs это не сделать.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: wait in bash
А почему не запустить в фоне 4 скрипта, каждый из которых будет ждать свою задачу, и в случае окончания ее работы будет запускать новую?
очень приблизительно:
waiter.sh
main.sh
очень приблизительно:
waiter.sh
Код: Выделить всё
for/while... job &; wait ...
main.sh
Код: Выделить всё
waiter.sh param1 &
waiter.sh param2 &
waiter.sh param3 &
waiter.sh param4 &
-
- Сообщения: 10
- ОС: Debian "squeeze/sid"
Re: wait in bash
Можно и так. Спасибо. Хотя в таком случае непонятно, как изначально разбить задачи по процессорам.
Время их выполнения не известно. Три могут быстро отработать, а у последнего еще 10 задач останется...
Время их выполнения не известно. Три могут быстро отработать, а у последнего еще 10 задач останется...
-
- Бывший модератор
- Сообщения: 4463
- Статус: GNU generation
- ОС: Debian GNU/Linux
-
- Сообщения: 10
- ОС: Debian "squeeze/sid"
Re: wait in bash
Я думаю что быстрее будет в `jobs -p` посмотреть, чем ps. Хотя принципиальной разницы нет.
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: wait in bash
А их не надо разбивать заранее. Сложить задачи в файл, прикрыть его lock-файлом (я пользуюсь dotlockfile из пакета liblockfile1 в Debian) и организовать очередь/стек/что еще в этом файле.
Мои розовые очки
-
- Сообщения: 10
- ОС: Debian "squeeze/sid"
Re: wait in bash
watashiwa_daredeska писал(а): ↑18.05.2009 14:10А их не надо разбивать заранее. Сложить задачи в файл, прикрыть его lock-файлом (я пользуюсь dotlockfile из пакета liblockfile1 в Debian) и организовать очередь/стек/что еще в этом файле.
Да так удобнее, спасибо.