ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Проблемы с обработкой SIGHUP

Раздел для разработчиков для обсуждения программных и аппаратных продуктов и их реализации.

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

Проблемы с обработкой SIGHUP

Сообщение unhack » 07 июн 2011, 13:52

Добрый день.
Возникла следующая ситуация.
Существует Asterisk (core show version Asterisk 1.8.3.2), собраный на Gentoo.
Из его плана набора вызывается AGI-скрипт, который строит голосовое меню.
Версия php:
Код: выделить все
php --version
PHP 5.3.6-pl0-gentoo (cli)

PHP собран со следующими флагами (в общей терминологии - с конфигурационными параметрами)

Код: выделить все
Configure Command =>  './configure'  '--prefix=/usr' '--build=i686-pc-linux-gnu' '--host=i686-pc-linux-gnu' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--datadir=/usr/share' '--sysconfdir=/etc' '--localstatedir=/var/lib' '--prefix=/usr/lib/php5.3' '--mandir=/usr/lib/php5.3/man' '--infodir=/usr/lib/php5.3/info' '--libdir=/usr/lib/php5.3/lib' '--with-libdir=lib' '--without-pear' '--disable-maintainer-zts' '--disable-bcmath' '--without-bz2' '--disable-calendar' '--disable-ctype' '--without-curl' '--without-curlwrappers' '--disable-dom' '--without-enchant' '--disable-exif' '--disable-fileinfo' '--disable-filter' '--disable-ftp' '--with-gettext' '--without-gmp' '--disable-hash' '--without-mhash' '--without-iconv' '--disable-intl' '--disable-ipv6' '--disable-json' '--without-kerberos' '--disable-libxml' '--enable-mbstring' '--with-mcrypt' '--without-mssql' '--with-onig=/usr' '--with-openssl' '--with-openssl-dir=/usr' '--enable-pcntl' '--disable-phar' '--disable-pdo' '--without-pgsql' '--without-pspell' '--without-recode' '--disable-simplexml' '--disable-shmop' '--without-snmp' '--disable-soap' '--disable-sockets' '--without-sqlite3' '--without-sybase-ct' '--disable-sysvmsg' '--disable-sysvsem' '--disable-sysvshm' '--without-tidy' '--disable-tokenizer' '--disable-wddx' '--disable-xml' '--disable-xmlreader' '--disable-xmlwriter' '--without-xmlrpc' '--without-xsl' '--disable-zip' '--without-zlib' '--disable-debug' '--enable-dba' '--without-cdb' '--with-db4' '--disable-flatfile' '--with-gdbm' '--disable-inifile' '--without-qdbm' '--without-freetype-dir' '--without-t1lib' '--disable-gd-jis-conv' '--without-jpeg-dir' '--without-png-dir' '--without-xpm-dir' '--without-gd' '--without-mysqli' '--with-unixODBC=/usr' '--without-adabas' '--without-birdstep' '--without-dbmaker' '--without-empress' '--without-esoob' '--without-ibm-db2' '--without-sapdb' '--without-solid' '--without-oci8' '--with-readline' '--without-libedit' '--disable-session' '--without-sqlite' '--with-pcre-regex=/usr' '--with-pcre-dir=/usr' '--with-config-file-path=/etc/php/cli-php5.3' '--with-config-file-scan-dir=/etc/php/cli-php5.3/ext-active' '--disable-embed' '--enable-cli' '--disable-cgi' '--disable-fpm' '--without-apxs2'
Server API => Command Line Interface


То есть все опции, которые нужны для передачи сигналов (posix, pcntl) включены.
Проблема возникает в следующем месте:
необходимо завершать выполнение скрипта в случае, если вызывающая сторона положила трубку.
Для этого в самом скрипте есть обработчик:

Код: выделить все
declare(ticks = 1);
function agi_hangup_handler($signo)
{
        syslog(LOG_INFO,"Exit cleanly");
        exit (0);
}
pcntl_signal(SIGHUP,  "agi_hangup_handler");


Так вот - не работает.
Была мысль, что что-то выставляет переменную AGISIGHUP.
при выполнении скрипта была добавлена проверка:

Код: выделить все
$agisighup = execute_agi('GET FULL VARIABLE ${AGISIGHUP}');
                $agiresult = $agisighup['data'];
                print_r($agiresult);


Но она показывает, что переменная пуста.

Функция execute_agi взята из документации к Астериску:
Код: выделить все
function execute_agi($command) {
     fwrite(STDOUT, "$command\n");
     fflush(STDOUT);
     $result = fgets(STDIN);
     syslog(LOG_NOTICE,"Data: ".$result);
     $ret = array('code'=> -1, 'result'=> -1, 'timeout'=> false, 'data'=> '');
     if (preg_match("/^([0-9]{1,3}) (.*)/", $result, $matches)) {
         $ret['code'] = $matches[1];
         $ret['result'] = 0;
         if (preg_match('/^result=([0-9a-zA-Z]*)(?:\s?\((.*?)\))?$/', $matches[2], $match))  {
             $ret['result'] = $match[1];
             $ret['timeout'] = ($match[2] === 'timeout') ? true : false;
             $ret['data'] = $match[2];
             syslog(LOG_NOTICE,"Data: ".$match[2]);
         }
     }
     return $ret;
}


При выполнении скрипта во время EXEC Background, да и в любое время сигнал SIGHUP, который должен генерировать Астериск, не обрабатывается.

Подскажите пожалуйста, в чем может быть проблема.
unhack
 
Сообщений: 1
Зарегистрирован: 06 июн 2011, 15:51

Re: Проблемы с обработкой SIGHUP

Сообщение akmonk » 03 июл 2011, 14:22

Та же самая проблема, не обрабатывается SIGHUP. Если положить трубку то скрипт завершается, возвращая -1. Может быть скрипт нужно по-особенному вызывать?
akmonk
 
Сообщений: 8
Зарегистрирован: 03 июл 2011, 14:19


Вернуться в Разработка

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH