2016-09-19 119 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); 
});