trap и ожидание процесса

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

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

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

trap и ожидание процесса

Сообщение SLEDopit »

В таком варианте все работает без нареканий и по kill -TERM выводится в консоль Got:

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

#!/bin/bash
trap 'echo Got' TERM
echo $$

while : ; do sleep 1; done
А вот в таком варианте, trap начинает ожидать завершения процесса и Got выводится только по ctrl+c:

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

#!/bin/bash
trap 'echo Got' TERM
echo $$

cat /dev/zero | while : ; do sleep 1; done
Если я правильно понял man bash
If bash is waiting for a command to complete and receives a signal for which a trap has been set, the trap will not be executed until the command completes. When bash is waiting for an asynchronous command via the wait builtin, the reception of a signal for which a trap has been set will cause the wait builtin to return immediately with an exit status greater than 128, immediately after which the trap is executed.
То второй вариант рабочим не сделать, да?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: trap и ожидание процесса

Сообщение sgfault »

SLEDopit писал(а):
08.06.2011 19:06
А вот в таком варианте, trap начинает ожидать завершения процесса и Got выводится только по ctrl+c

А у меня по Ctrl-C ничего не пишет :unsure:

SLEDopit писал(а):
08.06.2011 19:06
То второй вариант рабочим не сделать, да?

Это, конечно, не решение, но можно поставить trap в сам subshell или переписать без subshell-а -)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: trap и ожидание процесса

Сообщение SLEDopit »

sgfault писал(а):
08.06.2011 21:20
А у меня по Ctrl-C ничего не пишет
Я наверно немного некорректно объяснил. В первой консоли:

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

 $ cat 2.sh
#!/bin/bash

trap 'echo Got' TERM
echo $$

echo 123 | while : ; do sleep 1; done
 $ bash 2.sh
7243
тем временем в другой консоли:

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

 $ kill -TERM 7243
Далее в первой жмем ctrl+c и видим:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: trap и ожидание процесса

Сообщение sash-kan »

примерно так:

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

#!/bin/bash
trap 'kill $id; echo Got' TERM
echo $$

cat /dev/zero > /dev/null &

id=$!
wait $id
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: trap и ожидание процесса

Сообщение SLEDopit »

sash-kan писал(а):
08.06.2011 21:53
примерно так:
о, спасибо. примерно то, что нужно.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
trmt
Сообщения: 3

Re: trap и ожидание процесса

Сообщение trmt »

Доброго всем времени суток.
Вопрос также по сабжу.
Задача: запускать скриптом n параллельных процессов (не суть важно каких, в примерах слипы) на рандомное время каждый. Скрипт должен по завершению одного из процессов запускать такой же. При подаче сигнала на управляющий скрипт, он должен грохать все запущенные процессы. Использование job-cоntrols.
Проблемы:
1) отслеживание завершения дочерних процессов. Не ловит trap CHLD внутри скрипта.
2) встроенный kill не убивает дочерние процессы.
примерный текст:

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

#!/bin/bash

trap_chld ()
{
echo "Child procees is gone"
[кусок рестарта процесса]
}

trap_int
{
echo "Kill all child processes"
kill %1
sleep 1
... [например так, цикл с перечислением не меняет сути]
}

trap 'trap_chld' CHLD
trap 'trap-_int' INT

[кусок старта процессов]
( sleep 1000 & sleep $K && kill %1; echo "Killed 1" ) & # Запуск в фоне в сабшелле, K - рандомное число

while :
do
sleep 1
done


трап на INT работает отлично, но kill %1 не убивает слип на 1000, а делает его сиротой
трап на CHLD не работает вообще
если ставить трап на Сtrl-Z, то вешает скрипт

более простой скрипт

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

#!/bin/bash
( sleep 10000 & sleep 40 && kill %1 ) &
sleep 30 && kill %1
jobs
ps -f


и в противовес обычная строка баша
( sleep 10000 & sleep 40 && kill %1 ) &
и команда после этого kill %1

результат в баше - убивается сабшелл и убиваются все слипы
результат в скрипте - убивается сабшелл (а сабшелл ли это, потому что в ps -f пишется имя скрипта), но все слипы, запущенные в фоне, живут, и становятся сиротами. естественно, результат нужен как в баше - все умерло.

буду очень благодарен за решение проблемы с объяснениями, а еще лучше за совет/линк на соответствующую литературу.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: trap и ожидание процесса

Сообщение sash-kan »

trmt
после отсылки сигнала надо подождать (wait)·
смотрите мой пример выше в этой теме·

udp. иллюстрация:

Shell

$ cat file set -v sleep 5 & sleep 5 & jobs kill %1 jobs kill %2 jobs wait jobs $ bash file sleep 5 & sleep 5 & jobs [1]- Running sleep 5 & [2]+ Running sleep 5 & kill %1 jobs [1]- Running sleep 5 & [2]+ Running sleep 5 & kill %2 jobs [1]- Running sleep 5 & [2]+ Running sleep 5 & wait file: line 9: 17063 Terminated sleep 5 file: line 9: 17064 Terminated sleep 5 jobs $

Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
trmt
Сообщения: 3

Re: trap и ожидание процесса

Сообщение trmt »

убийство процесса решил слегка по-другому, но воспользовавшись советом, спасибо.
все еще нерешенная проблема насчет trap CHLD внутри скрипта.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: trap и ожидание процесса

Сообщение sash-kan »

trmt писал(а):
22.09.2011 16:16
trap CHLD
пример:

Shell

$ cat file set -v -o monitor trap 'echo child died' CHLD sleep 5 & kill %1 wait $ bash file trap 'echo child died' CHLD sleep 5 & kill %1 wait echo child died child died file: line 5: 18806 Terminated sleep 5

ключевое слово: "set -o monitor"
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
trmt
Сообщения: 3

Re: trap и ожидание процесса

Сообщение trmt »

спасибо огромное
Спасибо сказали: