У меня есть программа, которая общается с Asterisk через EAGI. Asterisk открывает мое приложение Node.js и отправляет ему данные через STDIN, а программа отправляет команды Asterisk через STDOUT. Когда пользователь вешает трубку, процессу Node.js отправляется команда SIGHUP. Это перехватывается для более чистого выхода. Этот функционал работает.
Asterisk также отправляет аудиоданные RAW по fd 3 (STDERR+1). Процесс Node.js правильно перехватывает данные и может читать звук, преобразовывать его или делать что-то еще, что необходимо сделать. Однако, когда createReadStream создается на fd 3, процесс Node.js НЕ завершается и быстро становится зомби. Если я закомментирую код createReadStream, Node.js выйдет, как и ожидалось.
Как я могу заставить Node.js выйти с помощью функции process.exit(), как и предполагалось? Я использую Node.js версии v0.10.30.
Код Node.js createReadStream:
// It was success
this.audioInStream = fs.createReadStream( null, { 'fd' : 3 } );
// Pipe the audio stream to a blackhole for now so it doesn't get queued up
this.audioInStream.pipe( blackhole() );
SIGHUP-код:
process
.on( 'SIGHUP', function() {
log.message.info( "[%s] Asterisk process hung up.", that.callerid );
that.exitWhenReady();
} );
функция exitWhenReady
Index.prototype.exitWhenReady = function() {
if( !this.canExit )
return;
log.message.info( "[%s] Exiting program successfully.", this.callerid );
// Get rid of our streams
this.audioInStream.unpipe();
this.audioInStream.close();
this.audioInStream.destroy();
process.exit( 0 );
};
Модуль черной дыры:
var inherits = require( 'util' ).inherits;
var Writable = require( 'stream' ).Writable;
var process = require( 'process' );
function Blackhole( opts ) {
if( !(this instanceof Blackhole) )
return( new Blackhole( opts ) );
if( !opts )
opts = {};
Writable.call( this, opts );
}
inherits( Blackhole, Writable );
Blackhole.prototype._write = function( chunk, encoding, done ) {
process.nextTick( done );
};
module.exports = Blackhole;
Примечательно, что
Процесс Asterisk завис
А также
Выход из программы успешно.
Никогда не появляйтесь в файле журнала, когда createReadStream читает fd 3, но когда это не так, они это делают.