AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Broken pipe

Newbies/FAQ Forum 48 сообщений 19.05.2009 12:53 - 04.10.2011 15:30
#1 19.05.2009 12:53

Broken pipe


Звоню через agi-скрипт. Сегодня началась ошибка валиться в лог:
[May 19 11:52:12] ERROR[28451]: utils.c:1019 ast_carefulwrite: write() returned error: Broken pipe

куда копать? подскажите.
Астер 1609
#2 19.05.2009 20:03

а сам AGI скрипт для анализа мы естественно должны сами придумать?
_________________
Успехов!
#3 20.05.2009 08:16

Проблема неожиданно решилась. Спасибо за внимание =)
#4 20.05.2009 10:22

а как именно решилась конечно же военная тайна. неадекват?
_________________
Успехов!
#5 11.08.2009 08:45

Прикол спрашивать у людей, а делится с людьми решением не вариант.
Хочу вновь поднять вопрос, потому как у меня постоянно вылетает такая ошибка, но почему я немогу понять,никакой закономерности появления не выявил, может появится при любом звонке или действии... а может и не появиться...
#6 24.09.2009 19:02

такая же проблема


привет...
ага, прям шаманство какое то, в диалплане четыре скрипта подряд выполняются и только после одного выдается такая ошибка.
ast_carefulwrite: write() returned error: Broken pipe

убираю скрипт, все нормально, ставлю на место, ошибка вылазит. Скрипт на "bash" , даже когда пустой (кроме заголовка #!/bin/bash) ошибка лезет.
Права на файл проверял такие же как и на другие скрипты !!!!

Видимо без бубна тут никак !!!
#7 25.09.2009 08:59

У меня выполняется куча скриптов, а вот ошибка такая может вылететь при любом скрипте абсолютно... Причём один раз может вылететь другой раз при таком же звонке может не вылететь. Скрипты перловые. Такое впечатление что AGI глючит... Скрипты работают корректно, никаких глюков или кривых запросов... В общем я так закономерность и не выявид ло сих пор... Причём появилась такая шнаяга именно после перехода с 1.4.22 версии на 4.24, на 4.26 проблема осталась... На 1.4.22 версии такой ошибки небыло. Скрипты не менялись...
#8 16.10.2009 05:55

Довелось тестировать голосовой сервис, поднятый на Asterisk, и периодически сталкивался с такой ошибкой, причем характер воспроизведения случайный.
Периодически появляется в таком случае: необходимо ввести некоторый цифровой код с телефона, и если это сделать быстро, при этом нажать больше, чем ожидается на ввод, происходит разрыв связи, а в логах этот эксепшн
org.asteriskjava.fastagi.AgiNetworkException: Unable to send command to Asterisk: Broken pipe
#9 23.11.2009 17:48

Столкнулся с такой же проблемой - получаю в консоль ERROR[4621]: utils.c:966 ast_carefulwrite: write() returned error: Broken pipe

Через AGI вызывается PHP-шный скрипт
Code:

#!/usr/bin/php
...
echo "SET VARIABLE NUMBER_ACCEPTED yes\n";
...


Переменная нормально устанавливается, диалплан нормально выполняется дальше, переменная в нем видна, но все-таки хотелось бы понять суть проблемы.
В первом приближении понятно, что ошибка появляется строго тогда когда AGI передает данные *.

Интуитивно мне кажется что когда * отвечает что-то скрипту, то у него не получается записать данные в поток. Похоже на правду?

Asterisk 1.4.26.2

_________________
Better simpler than clever
#10 30.12.2009 14:01

Так кто решил данный баг? ... у меня нна пхп такое вылазит
ERROR[20304]: utils.c:966 ast_carefulwrite: write() returned error: Broken pipe
Хотя сам скриптик очень сложный

#!/usr/bin/php -q


Или можно на эту ошибку не обращать внимание?
#11 30.12.2009 16:13

https://issues.asterisk.org/view.php?id=14379
решением как я понимаю будет обновить астериск до последнего.
ps: ссылка была в топе гугла.

_________________
Успехов!
#12 18.05.2010 15:10

У меня Asterisk 1.6.2.6.

При запуске AGI на perl вываливаются ошибки:
Code:
--
[May 18 18:11:11] ERROR[29085]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
[May 18 18:11:11] ERROR[29085]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
[May 18 18:11:11] ERROR[29085]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe


В 1.4.26.2 эти же скрипты работали без проблем
#13 18.05.2010 18:32

to dmitry_master
убери

\n
#14 27.01.2011 15:19

Файл global.php
Code:
...
function read() {
global $debug;
$input = str_replace("\n", "", fgets(STDIN, 4096));
if ($debug) fputs(STDERR, "read: $input\n");
return $input;
}

function write($line) {
global $debug;
if ($debug) fputs(STDERR, "write: $line\n");
#echo $line."\n";
fputs(STDOUT, "$line\n");
$a = read();
$num = substr($a,14);
$num = substr($num,0,-1);
return $num;
}
...


Сам agi скрипт
Code:
#!/usr/bin/php -q


совершаю вызов, вызывается agi скрипт, начинаю слушать сообщение и не дослушав кладу трубку, в логах вижу
Code:
-- Launched AGI Script /var/lib/asterisk/agi-bin/agi/tech-support.php
-- AGI Script Executing Application: (Playback) Options: (leavemessage_tech)
-- Playing 'leavemessage_tech' (language 'ru')
-- AGI Script Executing Application: (Record) Options: (/var/spool/asterisk/recordmessages/vm2011_01_27_17_04_10_tech_support_0.wav)
[2011-01-27 17:04:10] WARNING[21115]: file.c:768 ast_readaudio_callback: Failed to write frame
-- Playing 'beep' (language 'ru')
[2011-01-27 17:04:10] WARNING[21115]: app_record.c:243 record_exec: ast_streamfile failed on SIP/test-check-000090b9
[2011-01-27 17:04:10] ERROR[21115]: utils.c:968 ast_carefulwrite: write() returned error: Broken pipe
-- AGI Script agi/tech-support.php completed, returning 0

т.е после Playback он пытается выполнить Record, хотя я думаю он должен был выполнить agi_hangup_handler и завершить работу скрипта. В логах видно что скрипту выдается соответствующий сигнал
Code:
# strace -fp 23810
Process 23810 attached - interrupt to quit
read(0, "200 result=-1\n"..., 8192) = 14
write(2, "read: 200 result=-1\n"..., 20) = 20
--- SIGHUP (Hangup) @ 0 (0) ---


Иногда, при непонятных обстоятельствах он отрабатывает нормально. Так же, если добавить одну строчку после Playback, то всегда все работает как нужно
Code:
write("EXEC Playback leavemessage_tech");
write("");

но хочется найти причину сего, а не ставить подпорки.
#15 31.01.2011 06:38

а предыдущий совет не пробовали? судя по листингам ващих скриптов - еще нет.
_________________
Успехов!
#16 31.01.2011 07:55

Если убрать \n из fputs(STDOUT, "$line\n"); , тогда скрипт не работает, т.к команда видимо должна всегда завершаться концом строки.
#17 31.01.2011 07:59

хм. логично.
_________________
Успехов!
#18 04.02.2011 21:31

а заменить \n на \rn
#19 07.02.2011 10:13

наверное имелось ввиду \r\n , он это буквально понимает и делает перенос строки, так что окончание должно быть \n
#20 06.06.2011 20:07

Тоже столнулся с этой проблемой, последние советы попробовал не помогает...

Code:
[Jun 6 23:08:21] == Using SIP RTP CoS mark 5
[Jun 6 23:08:21] -- Executing [7579@office:1] Answer("SIP/101-0000000d", "") in new stack
[Jun 6 23:08:21] -- Executing [7579@office:2] AGI("SIP/101-0000000d", "test.php") in new stack
[Jun 6 23:08:21] -- Launched AGI Script /var/lib/asterisk/agi-bin/test.php
[Jun 6 23:08:21] test.php: phrase
[Jun 6 23:08:21] ERROR[496]: utils.c:1133 ast_carefulwrite: write() returned error: Broken pipe
[Jun 6 23:08:21] -- AGI Script test.php completed, returning 0
[Jun 6 23:08:21] -- Auto fallthrough, channel 'SIP/101-0000000d' status is 'UNKNOWN'


Code:
#!/usr/bin/php -q

_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
#21 06.06.2011 22:16

aven, нагрузка на сервер(на котором работает астер) в среднем и в моменты ошибки какая?
замечено, что некоторое количество софта просто отваливается если операции ввода/вывода работают долго(благодаря их большому количеству например, или медленной работе сервисной стороны). Возможно даже изза бага libc или какой-нибудь другой прокладки которая не ожидает долгой работы.

_________________
Slackware 13.1 - Asterisk 1.8
#22 06.06.2011 22:32

Это единственный открытый канал Sad
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
#23 06.06.2011 23:40

и никаких параллельных закачек/торрентов, компиляций, сетевой активности?
жаль под рукой нету исходников... пару раз был такой проблем, но там была вина AGI(то ли он умер преждевременно, то ли сам висел на select-е сокета, в общем ему было чхать на хост в лице *) и рытье в исходниках * подтвердило именно глюкавость AGI.

_________________
Slackware 13.1 - Asterisk 1.8
#24 07.06.2011 04:57

У меня ошибки с broken pipe вылазят только когда AGI/AMI приложения "забывают" вычитывать ответы от астера. Доказано и проверено на практике.
#25 07.06.2011 11:04

Возможно что он и не успевает что-то прочитать... я и не читаю, делаю отправку сообщений только, никаких wait и sleep не ставлю.
Через AMI та же проблема:
Code:
[Jun 7 13:57:18] ERROR[2678]: utils.c:1180 ast_careful_fwrite: fwrite() returned error: Broken pipe
[Jun 7 13:57:18] ERROR[2678]: utils.c:1180 ast_careful_fwrite: fwrite() returned error: Broken pipe
[Jun 7 13:57:18] ERROR[2678]: utils.c:1180 ast_careful_fwrite: fwrite() returned error: Broken pipe
[Jun 7 13:57:18] ERROR[2678]: utils.c:1180 ast_careful_fwrite: fwrite() returned error: Broken pipe

_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
#26 07.06.2011 11:10

все очень просто. то что вы не читаете, не значит что астер не пытается вам писать. измените код так:

Code:
#!/usr/bin/php -q


и еще, судя по -q в параметрах вызова php, вам стоит добавть сюда в начало скрипта следущие вызовы:

Code:
ob_implicit_flush(false);
set_time_limit(5);
error_reporting(0);
#27 08.06.2011 06:29

Что бы было совсем правильно и не возникало Broken pipe, надо сделать так:

Code:
#!/usr/bin/php -q


Объясню зачем нужен первый блок с while(fgets). Когда астер запускает скрипт, самым первым делом, он сыпет ему на STDIN некоторые канальные переменные, которые затем можно использовать в скрипте, добавляя к ним префикс ast_.
#28 08.06.2011 19:43

xelas, спасибо, все верно, если читать ответы, то ошибок нет.
Я так понимаю phpagi этим и занимается в том числе.

Параметр -q как я понимаю уже не актуален и оставлен для совместимости.

_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
#29 09.06.2011 08:58

параметр -q для пхп очень даже актуален. НО! Только в том случае, если php собран как CGI. И означает он:

Code:
-q Quiet-mode. Suppress HTTP Header output.


Что бы проверть как собран php досточно запустить php -v

Будет либо:
PHP 5.1.6 (cgi-fcgi) (built: Nov 29 2010 16:43:56)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

либо:
PHP 5.1.6 (cli) (built: Nov 29 2010 16:47:46)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
#30 09.06.2011 09:46

Как CGI я так понял сейчас уже почти никто не использует, для апача используется в виде модуля, а для системы в виде CLI.
Quote:
# php -v
PHP 5.3.6-pl0-gentoo (cli) (built: May 26 2011 17:25:39)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies


xelas, а можешь пару слов о phpagi.php сказать, стоит использовать или есть смысл свой класс написать?

_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
#31 09.06.2011 10:12

Брал я его на попробывать. Впечатление --- непоравилось. Но, может быть, это мне так сильно не повезло. Да и не считаю я хорошей задумкой писать цельный класс для обертки пары десятков вызовов. Хотя, с другой стороны, кому-то так будет легче.


ПС по поводу "непонравилось": та версия, которая была у меня в руках, была скачена с офсайта, декларировалась как стабильная, но пестрила массой ошибок. Как результат многие методы просто не работали. В результате, полдня ушло только на то, что бы все исправить в коде phpagi. Нисколько не хочу умалить труд разработчиков phpagi, они молодцы. Просто надо чуть тщательнее подходить к релизам. Но и в любом случае, как я уже говорил выше -- это не мой путь.
#32 09.06.2011 12:49

уже сколько лет работает phpagi
может быть нужно разобраться в чем проблема? а не писать что плохо работает.
я то же не сторонник классов. но на один "->" в запросе больше, зато удобств масса.
#33 09.06.2011 13:02

А почему бы не сделать просто набор функций?

Code:
#!/usr/bin/php

_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
#34 09.06.2011 13:09

вариант. можно конечно.
смысл тот же.

просто зачем делать если есть готовое?

играет роль, что нужно получить в таком AGI.
а может вообще лучше не использовать php, а например bash обойтись.
#35 09.06.2011 20:27

Попробовал вариант предложенный xelas добавить в начало, почемуто скрипт перестал работать. До этого хоть и с "ast_carefulwrite: write() returned error: Broken pipe", но работал. Пришлось приглушить желание чтобы в CLI отсутствовали сообщения выделеные красным.
Скрипт простенький, смысл открывает порт бросает сообщение и закрывает его:

Code:

#!/usr/bin/php -q



Еще так и не понял, что не правильно делаю. Запускаю скрипт в h контексте функцией DeadAGI, вроде по теории верно, а на практике появляется варнинг(но самое главное работает):
WARNING[361]: res_agi.c:3784 deadagi_exec: DeadAGI has been deprecated, please use AGI in all cases!

Пробовал запускать как AGI но не работает. Может кто может что то сказать по этому поводу? DeadAGI has been deprecated переводится вроде "DeadAGI является устаревшим". Использую 1.8.4 астериск, может что то поменялось.
#36 09.06.2011 21:08

Все верно, теперь AGI работает везде.
Попробуйте phpagi

_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
#37 10.06.2011 04:59

exit(0) то уберите в середине скрипта.
#38 10.06.2011 09:46

to xelas:
Да убирание exit(0) помогло выполнению скрипта. Но всеравно загадочный брокен пип выскакивает.
Что ты можешь сказать про этот код (нашел на voip.rus.net)^
Quote:
Asterisk всегда отсылает пучок в каждый момент времени к agi, вызываемый как показано ниже:

agi_request: test.php
agi_channel: Zap/1-1
agi_language: en
agi_type: Zap
agi_callerid:
agi_dnid:
agi_context: default
agi_extension: 1000
agi_priority: 1

Сохраните инфу с этой функцией (или пример ниже):


while (!feof($stdin)) {
$temp = fgets($stdin);
$temp = str_replace("\n","",$temp);
$s = explode(":",$temp);
$agivar[$s[0]] = trim($s[1]);
if (($temp == "") || ($temp == "\n")) {
break;
}
}


Может этот код попробовать или это одно и тоже что ты привел выше?

to aven:
phpAGI мне выдала No Aplication. Он в стандартной сборке не идет я так понимаю, тоесть нужно модуль доустанавливать.
#39 10.06.2011 10:10

В этом примере прото запоминаются переменные.
Тут качай, это обычный php-файл.
http://phpagi.sourceforge.net/

_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
#40 28.06.2011 11:37

Господа, а что делать с perl? Та же фигня, вид сбоку (broken pipe).

скрипт начинается так:
while() {
chomp;
last unless length($_);
if (/^agi_(\w+)\:\s+(.*)$/) {
$AGI{$1} = $2;
}
}


пробовал в начало добавлять

$|=1;


не помогает....
#41 28.06.2011 12:46

- показать продолжение скрипта

- сделать agi set debug on в cli
#42 28.06.2011 13:15

Вот скрипт целиком:
#!/usr/bin/perl
use strict;
use DBI;

my $debug=1;
my $prefix_add_count=7; #К-во знаков в локальном наборе (меньше этого будем прибавлять prefix_add)
my $prefix_add='7812'; #Что прибавлять

my $allow_nowmonth_credit=1; # Разрешить не отключать локльную связь в этом месяце

open F , "/etc/bill.conf" or die ("Can't open config file: /etc/bill.conf\n");
my @lines=;
my $config;
foreach (@lines){
chomp;
next if /^#/;
next if /^;/;
~s/\s//g;
my ($name,$value)=split(/=/);
$config->{$name}=$value;
}
close F;

my ($dbase,$user,$password);

$dbase = "DBI:mysql:".$config->{dbase}.":".$config->{dbhost} if (defined $config->{dbhost} && defined $config->{dbase});
$user = $config->{dbuser} if (defined $config->{dbuser});
$password = $config->{dbpassword} if (defined $config->{dbpassword});

die ("Database, username or password not specified in /etc/bill.conf!\n") if (!($dbase && $user && $password));

my $db = DBI->connect($dbase,$user,$password) or { die("Cannot open database $_") };

# Setup some variables
my %AGI;

while() {
chomp;
last unless length($_);
if (/^agi_(\w+)\:\s+(.*)$/) {
$AGI{$1} = $2;
}
}

if ($debug){
print "VERBOSE \"BILLING_CLIENT_OUT: AGI Environment Dump:\" 5\n";
foreach my $i (sort keys %AGI) {
print STDERR " -- \n";
print "VERBOSE \"BILLING_CLIENT_OUT: AGI VARIABLE $i = $AGI{$i}\" 5\n" ;
}
}
my $dst_number=fix_number($AGI{extension});
verbose("DIALING NUMBER = $dst_number");

my $src_channel;
if ($AGI{channel}=~/^.*?\/(.*?)-[^-]+$/i){
$src_channel=$1;
verbose("SOURCE CHANNEL = $src_channel");
}

my $phone_id=$AGI{accountcode};
verbose("ACCOUNT CODE = $phone_id");

my $force_max_duration=50*60;

if ($phone_id){
my $mask_info=$db->selectrow_hashref("
SELECT trfzone_id,
group_id,
mask
FROM phones_masks
WHERE is_active=1 AND '".$dst_number."' LIKE CONCAT ( country_code, mask, '%' )
ORDER BY LENGTH ( CONCAT ( country_code, mask ) ) DESC
LIMIT 1
");
if ($mask_info){
my $user_info=$db->selectrow_hashref("
SELECT up.allow_city,
up.allow_mobile,
up.allow_crosscity,
up.allow_crosscountry,
up.enabled,
us.uid,
u.balance + COALESCE((SELECT SUM(summ) FROM pays_promise WHERE uid=u.id AND date_end>NOW() AND completed=0),0) as balance,
u.lim_money,
u.paytype,
ua.status,
EXTRACT(YEAR_MONTH FROM ua.refdate) as yearmonth_status,
EXTRACT(YEAR_MONTH FROM NOW()) as yearmonth_now,
ttz.price_min

FROM users_phones up
JOIN users_services us ON (up.service=us.id)
JOIN users u ON (us.uid=u.id)
JOIN users_active ua ON (u.curstatus_id=ua.id)
JOIN users_services_tarif ust ON (us.curr_service_tarif_id=ust.id)
JOIN tarifs t ON (ust.tarif=t.trf_id)
JOIN tarifs_trfzones ttz ON (ttz.trf_id=t.trf_id AND ttz.is_active=1 AND ttz.trfzone_id=$mask_info->{trfzone_id})

WHERE up.id = $phone_id
");

if ($user_info){
if ($user_info->{enabled}){
if ($user_info->{status}==1){
if (($mask_info->{group_id}==1 && $user_info->{allow_city}) ||
($mask_info->{group_id}==2 && $user_info->{allow_mobile}) ||
($mask_info->{group_id}==3 && $user_info->{allow_crosscity}) ||
($mask_info->{group_id}==4 && $user_info->{allow_crosscountry})){
#verbose("BALANCE:".$user_info->{balance});
my $maxduration;
if ($user_info->{paytype}==1 || $user_info->{balance}>=$user_info->{lim_money} || $user_info->{price_min}==0){
$maxduration=int($user_info->{balance}/$user_info->{price_min})*60 if ($user_info->{price_min});
if (!$maxduration || $maxduration$force_max_duration){
$maxduration=$force_max_duration;
verbose("Setting max duration to 50 minutes");
}
#$maxduration=30;
print "SET VARIABLE TIMEOUT(absolute) \"$maxduration\" \n" if ($maxduration);
verbose("allow, cost per minute: ".$user_info->{price_min}." maximum call duration: ".$maxduration." seconds" );
} else {
verbose("Balance < 0");
forbidden();
}
} else {
#this type of service was disabled
verbose("this type of service is disabled");
forbidden();
}
} else {
if ($allow_nowmonth_credit && $user_info->{yearmonth_status} eq $user_info->{yearmonth_now} && $user_info->{price_min}==0){
#was disabled in current month
#allow free calls
print "SET VARIABLE TIMEOUT(absolute) \"$force_max_duration\" \n" if ($force_max_duration);
verbose("allow, cost per minute: ".$user_info->{price_min}." maximum call duration: ".$force_max_duration." seconds" );
} else {
verbose("billing status=".$user_info->{status});
forbidden_nomoney();
}
}
} else {
#enable!=1
verbose("enable!=1");
forbidden();
}
} else {
verbose("account_code not found");
forbidden();
}
} else {
# UNKNOWN MASK
verbose("no such mask");
forbidden();
}
}

sub verbose{
my $message=shift;
my $level=shift || 1;
print "VERBOSE \"BILLING_CLIENT_OUT: [account:".$AGI{accountcode}."] dialing ".fix_number($AGI{extension}).": ".$message."\" ".$level."\n";
}

sub forbidden{
verbose("access forbidden");
print "EXEC PLAYBACK \"custom/bill/message_call_forbidden\" \n";
#print "EXEC PLAYBACK \"custom/bill/curstatusis&custom/bill/curstatusis-nomoney\" \n";
print "HANGUP ".$AGI{channel}."\n";
}

sub forbidden_nomoney{
verbose("access forbidden: no money");
print "EXEC PLAYBACK \"custom/bill/message_call_forbidden_nomoney\" \n";
#print "EXEC PLAYBACK \"custom/bill/curstatusis&custom/bill/curstatusis-nomoney\" \n";
print "HANGUP ".$AGI{channel}."\n";
}

sub fix_number{
my $number=shift;
$number=$prefix_add.$number if (length($number)> agi_request: bill/client_out.pl
AGI Tx >> agi_channel: SIP/78126409768-00064f44
AGI Tx >> agi_language: en
AGI Tx >> agi_type: SIP
AGI Tx >> agi_uniqueid: 1309263202.413508
AGI Tx >> agi_version: 1.6.2.11
AGI Tx >> agi_callerid: 78126409768
AGI Tx >> agi_calleridname: 78126409768
AGI Tx >> agi_callingpres: 0
AGI Tx >> agi_callingani2: 0
AGI Tx >> agi_callington: 0
AGI Tx >> agi_callingtns: 0
AGI Tx >> agi_dnid: 6408640
AGI Tx >> agi_rdnis: unknown
AGI Tx >> agi_context: silverbill4-out
AGI Tx >> agi_extension: 6408640
AGI Tx >> agi_priority: 1
AGI Tx >> agi_enhanced: 0.0
AGI Tx >> agi_accountcode: 221
AGI Tx >> agi_threadid: 140528377334032
AGI Tx >>
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx > 200 result=1
[Jun 28 16:13:22] ERROR[26638]: utils.c:1128 ast_carefulwrite: write() returned error: Broken pipe
AGI Rx
#43 28.06.2011 13:22

воспольззоваться модулем со CPAN или самому взять за правило проверять статус вызова AGI команд...
#44 28.06.2011 13:37

В 1.4 все работало без проблеем. Каким образом нужно проверять статус вызова?
#45 28.06.2011 13:45

print "VERBOSE .....\n";
my $response = ;
print STDERR "Response: $response";

как минимум. Но яб таки сходил на спан и забрал уже Asterisk::AGI, хотя судя по умело скопированному от туда куску с разбором agi_ переменных он уже у Вас есть.
#46 28.06.2011 13:48

Ок, понял. Спасибо.
#47 28.06.2011 14:54

xelas wrote:
У меня ошибки с broken pipe вылазят только когда AGI/AMI приложения "забывают" вычитывать ответы от астера. Доказано и проверено на практике.

Или не успевают.
Я пользуюсь телефонной книгой и на *1.4 никогда не было проблем, на *1,6 - начали валиться ошибки, а на *1,8 - вообще не работает.
Так надо просто вставить один sleep(1); в конце.

Code:

$timeout = 10;
$asterisk_ip = "127.0.0.1";
$socket = fsockopen($asterisk_ip,"5038", $errno, $errstr, $timeout);
fputs($socket, "Action: Login\r\n");
fputs($socket, "UserName: $UserName\r\n");
fputs($socket, "Secret: $Secret\r\n\r\n");
fputs($socket, "Action: Originate\r\n" );
fputs($socket, "Channel: SIP/$ext\r\n" );
fputs($socket, "Exten: $num\r\n" );
fputs($socket, "Callerid: $ext to $call \r\n");
fputs($socket, "Timeout: 15000\r\n" );
fputs($socket, "Context: $context\r\n" );
fputs($socket, "Priority: 1\r\n" );
fputs($socket, "Async: yes\r\n\r\n" );
fputs($socket, "Action: Logoff\r\n\r\n");
sleep (1);
$wrets=fgets($socket,128);
#48 04.10.2011 15:30

Простите что влезаю. но на 1.8.7 чуть по другому решилось:
скрипт на PHP возвращал всего три переменных, и вообще это единственное что возвращается:
Code:
fputs($stdout,"SET VARIABLE MY_REALCALLTO ".$mycalltoreal."\n");
fputs($stdout,"SET VARIABLE MY_NOANSDELAY ".$mycall_beforeforward."\n");
fputs($stdout,"SET VARIABLE MY_NOANSNUMBER ".$mycall_forwardnoans."\n");
fflush($stdout);

а на финише было
Code:
$result = fgets($stdin);
exit(0);

sleep не очень помогал. по крайней мере пару раз с двух секундным ожиданием прокатило.
но вот такая вот конструкция заработала
Code:
$result = fgets($stdin);
$result = fgets($stdin);
$result = fgets($stdin);
exit(0);

Что скажут уважаемые гуру насчет такого странного поведения *?