2016-09-19 128 views
0

我正在尝试编写一个吞咽任务来执行程序,并等待任何按键来退出程序。如何正确结束吞噬任务

到目前为止,我有这样的:

gulp.task('runDevelopment', function (done) { 
    console.log('\n\n---\nPress any key to exit\n---\n'); 

    var api = spawn('node', ['node_modules/api-gateway-server/server.js', 'etc/swagger.yaml']); 
    api.stdout.on('data', function (data) { 
    console.log(data.toString()); 
    }); 
    api.stderr.on('data', function (data) { 
    console.log(data.toString()); 
    }); 

    process.stdin.on('data', function() { 
    api.kill('SIGKILL'); 
    done(); 
    }); 
}); 

这将运行该程序,并杀死它作为预期,但一饮而尽决不会退却。我看到这在控制台:

20:04 $ gulp 
[20:06:54] Using gulpfile ~/Development/swiki/gulpfile.js 
[20:06:54] Starting 'documentCopy'... 
[20:06:54] Starting 'documentZip'... 
[20:06:54] Starting 'runDevelopment'... 


--- 
Press any key to exit 
--- 

[20:06:54] Finished 'documentCopy' after 52 ms 
[20:06:54] Finished 'documentZip' after 41 ms 
[20:06:54] Starting 'package'... 
[20:06:54] Finished 'package' after 4.9 μs 
API Gateway server listening on port 7111 

[20:06:57] Finished 'runDevelopment' after 3.06 s 
[20:06:57] Starting 'run'... 
[20:06:57] Finished 'run' after 2.72 μs 
[20:06:57] Starting 'default'... 
[20:06:57] Finished 'default' after 1.16 μs 
Terminated: 15 
✘-TERM ~/Development/swiki [master|…6] 
20:07 $ 

一口给我Terminated: 15后,才killall gulp在另一端。

我怎样才能让它正常工作?

回答

2

问题是您通过发送SIGKILL成功终止子进程,但是您仍在监听父进程的process.stdin上的传入数据。只要你这样做,父进程就不会退出。

你必须明确地告诉process.stdin通过调用stream.pause()不再发出'data'事件:

process.stdin.on('data', function() { 
    process.stdin.pause(); 
    api.kill('SIGKILL'); 
    done(); 
}); 

如果一切都失败了,你也可以拨打process.exit()作为最后的手段:

process.stdin.on('data', function() { 
    api.kill('SIGKILL'); 
    done(); 
    process.exit(0); 
});