我有一个通过EAGI与Asterisk通信的程序。 Asterisk打开我的Node.js应用程序,并通过STDIN向其发送数据,程序通过STDOUT向Asterisk发送命令。当用户挂断电话时,Node.js进程会收到SIGHUP命令。为了更好地退出,这个功能已经可以运作。
Asterisk还在fd 3(STDERR+1)上发送原始音频数据。Node.js进程正确拦截数据,并能够读取音频、转换音频或执行其他操作。然而,当在fd 3上创建createReadStream时,Node.js进程不会退出,并迅速变成僵尸进程。如果我注释掉createReadStream代码,Node.js将按预期退出。
如何让Node.js使用process.exit()函数正常退出?我正在使用Node.js版本v0.10.30。
Node.js createReadStream代码:
退出WhenReady函数
黑洞模块:
值得注意的是,当使用createReadStream读取fd 3时,Asterisk进程挂断和成功退出程序的日志不会显示在日志文件中,但是在其它情况下,这些日志会被记录。
Asterisk还在fd 3(STDERR+1)上发送原始音频数据。Node.js进程正确拦截数据,并能够读取音频、转换音频或执行其他操作。然而,当在fd 3上创建createReadStream时,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();
} );
退出WhenReady函数
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;
值得注意的是,当使用createReadStream读取fd 3时,Asterisk进程挂断和成功退出程序的日志不会显示在日志文件中,但是在其它情况下,这些日志会被记录。