Страница 1 из 1

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

Добавлено: 14 июн 2019, 18:04
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,)

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

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

Если у вас скрипт завершается, то смотрите с каким кодом, включите agi debug и смотрите в CLI *. Дополнительно напихайте строчки с дебагом в своем скрипте. Поймете где он выпадает и на чем он завершается.
Так же не помешает запустить скрипт руками, но с правами пользователя и группы от которых запущен Asterisk.

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

Добавлено: 15 июн 2019, 13:39
yvatfwp
Из-за чего как раз и приходится выдумывать костыли, чтобы изменить это поведение.
Угу, можно еще запускать скрипты с timeout на выполнение, если не выполнился в указаное время, возвращать какой нибудь код вида 504 timeout, ну и как нибудь отдельно складывать такие варианты и уже по факту разбираться.

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

Добавлено: 15 июн 2019, 13:51
ValentO
Да, скрипт завершается. Но не с тем результатом которым нужно, к сожалению. agi debug - включали,по этому и видим не тот результат.
Все Ваши слова подтвердились,когда вызывается AGI, то Asterisk ждет завершения скрипта и dialplan вместе с ним. Проблему нашли,при выполнении скрипта от юзера asterisk не отрабатывала команда,которая и приводила к краху скрипта, потому что, отдавал не то значение аргумента. Соответственно из-за этого рушилась вся логика. Сейчас все заработало! Спасибо за помощь! :)

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

Добавлено: 17 июн 2019, 14:02
Zavr2008
Digium активно рекомендует избавляться от подобного и свои приложения соединять по ARI.