VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Ожидание выполнение скрипта на bash

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

Ответить
djan
Сообщения: 3
Зарегистрирован: 23 май 2019, 22:19

Ожидание выполнение скрипта на bash

Сообщение djan »

Помогите разобраться. Есть свой кусок диалплана в котором вызывается скрипт - ivr-main.sh, который проверяет пользователя на баланс и доступность его оборудования. Проблема в том, что после вызова asterisk не дожидается его завершения, скрипт в свою очередь должен вернуть значения на основании которых мы работаем дальше, это - response, ping, uid, deposit. Мы получаем проблему так как скрипт выполняется примерно 2-3сек а asterisk его не ждет соответственно просто идет дальше.
Как заставить asterisk ждать полного завершения скрипта?

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


[ivr-main]
exten => s,1,NoOp(-----Start IVR-----)
exten => s,n,Playback(/var/lib/asterisk/sounds/custom/Welcome_gsm)
exten => s,n,Answer
exten => s,n,NoOp(---Start check abon---)
exten => s,n,Verbose(Check DB if response 5)
exten => s,n,AGI(ivr-main.sh, ${CALLERID(num)})
exten => s,n,GotoIf($["${response}" = "5"]?connection:notconnection)
exten => s,n(notconnection),Goto(ext-queues,001,3)
exten => s,n(connection),GotoIf($["${uid}" = "1"]?exist:notexist)
exten => s,n,Verbose(Uid if notexist 1 ${uid})
exten => s,n,GoToIf($["${uid}" = "1"]?exist:notexist)
exten => s,n(exist),Goto(ext-queues,001,3)

exten => s,n,Verbose(Deposit if exist deb 1 ${deposit})
exten => s,n(notexist),GotoIf($["${deposit}" = "2"]?debtor:notdebtor)
exten => s,n(debtor),Playback(/var/lib/asterisk/sounds/custom/thanks_opinion_gsm)
exten => s,n,Wait(1)
exten => s,n(debtor),Goto(ivr-digit-money,s,1)

exten => s,n,Verbose(Deposit if exist ping 3 ${ping})
exten => s,n(notdebtor),GotoIf($["${ping}" = "4"]?allok:notok)
exten => s,n(allok),Playback(/var/lib/asterisk/sounds/custom/thanks_opinion_gsm)
exten => s,n(allok),Goto(ivr-digit-sw,s,1)
exten => s,n(notok),Goto(ext-queues,001,3)

[ivr-digit-money]
exten => s,1,NoOp(Start IVR money)
exten => s,n,Background(/var/lib/asterisk/sounds/custom/thanks_opinion_gsm)
exten => s,n,Background(silence/10,m)
exten => s,n,Background(/var/lib/asterisk/sounds/custom/thanks_opinion_gsm)
exten => s,n,Background(silence/10,m)
exten => s,n,Macro(hangupcall,)

exten => 1,1,NoOp(Press one money)
exten => 1,n,Background(/var/lib/asterisk/sounds/custom/thanks_opinion_gsm)
exten => 1,n,Macro(hangupcall,)

exten => 2,1,Goto(ext-queues,001,3)

[ivr-digit-sw]
exten => s,1,NoOp(Start IVR sw) 
exten => s,n,Background(/var/lib/asterisk/sounds/custom/thanks_opinion_gsm)
exten => s,n,Background(silence/10,m)
exten => s,n,Background(/var/lib/asterisk/sounds/custom/thanks_opinion_gsm)
exten => s,n,Background(silence/10,m)
exten => s,n,Macro(hangupcall,)

exten => 1,1,NoOp(Press one sw)
exten => 1,n,AGI(create_tt.sh, ${CALLERID(num)})
exten => 1,n,NoOp(---Start check DB ivr-sw---)
exten => 1,n,Verbose(Check DB if response ${ttexist} 2 )
exten => 1,n,GotoIf($["${ttexist}" = "2"]?connection:notconnection)
exten => 1,n(connection),GotoIf($["${ttexist}" = "2"]?ticketswexist:ticketswnoexist)
exten => 1,n(notconnection),Goto(ext-queues,001,3)

Vladyslav Makogon, [14.06.19 17:56]
exten => 1,n,Verbose(Chek tt if exist tt 2 ${ttexist})
;exten => 1,n,GotoIf($["${ttexist}" = "2"]?ticketswexist:ticketswnoexist)
exten => 1,n(ticketswexist),Playback(/var/lib/asterisk/sounds/custom/queue_2018_gsm)
exten => 1,n,Macro(hangupcall,)
exten => 1,n(ticketswnoexist),Goto(ivr-create-tt,s,1)

exten => 2,1,Goto(ext-queues,001,3)

[ivr-create-tt]
exten => s,1,NoOp(Start IVR create ttt)
exten => s,n,Playback(/var/lib/asterisk/sounds/custom/thanks_opinion_gsm)
exten => s,n,Macro(hangupcall,)
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Ожидание выполнение скрипта на bash

Сообщение virus_net »

Все как раз наоборот.
Когда вызывается AGI, то Asterisk всегда ждет завершения выполнения скрипта и dialplan не двигается далее.
Из-за чего как раз и приходится выдумывать костыли, чтобы изменить это поведение.

Если у вас скрипт завершается, то смотрите с каким кодом, включите agi debug и смотрите в CLI *. Дополнительно напихайте строчки с дебагом в своем скрипте. Поймете где он выпадает и на чем он завершается.
Так же не помешает запустить скрипт руками, но с правами пользователя и группы от которых запущен Asterisk.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
yvatfwp
Сообщения: 73
Зарегистрирован: 27 окт 2015, 11:50

Re: Ожидание выполнение скрипта на bash

Сообщение yvatfwp »

Из-за чего как раз и приходится выдумывать костыли, чтобы изменить это поведение.
Угу, можно еще запускать скрипты с timeout на выполнение, если не выполнился в указаное время, возвращать какой нибудь код вида 504 timeout, ну и как нибудь отдельно складывать такие варианты и уже по факту разбираться.
ValentO
Сообщения: 5
Зарегистрирован: 27 май 2019, 17:46

Re: Ожидание выполнение скрипта на bash

Сообщение ValentO »

Да, скрипт завершается. Но не с тем результатом которым нужно, к сожалению. agi debug - включали,по этому и видим не тот результат.
Все Ваши слова подтвердились,когда вызывается AGI, то Asterisk ждет завершения скрипта и dialplan вместе с ним. Проблему нашли,при выполнении скрипта от юзера asterisk не отрабатывала команда,которая и приводила к краху скрипта, потому что, отдавал не то значение аргумента. Соответственно из-за этого рушилась вся логика. Сейчас все заработало! Спасибо за помощь! :)
Аватара пользователя
Zavr2008
Сообщения: 2211
Зарегистрирован: 27 янв 2011, 00:35
Контактная информация:

Re: Ожидание выполнение скрипта на bash

Сообщение Zavr2008 »

Digium активно рекомендует избавляться от подобного и свои приложения соединять по ARI.
Российские E1 шлюзы Alvis. Модернизация УПАТС с E1,Подключение к ИС "Антифрод" E1 PRI/SS#7 УВР Телестор, Грифин и др..
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH