如何从grunt-contrib-watch杀死的进程释放资源?

我试图使用模块grunt-contrib-watch来重新启动我的node.js服务器,每当某些文件更改。 我已经使用grunt运行服务器,jshint和模板编译器,我知道这些函数的工作。 以下是启动服务器的任务:

 grunt.registerTask('runServer', 'Starts the server.', function(){ grunt.log.writeln('Starting server...'); var done = this.async(); var child = grunt.util.spawn({ cmd: process.argv[0], args: ['server.js'], }, function(){ grunt.log.writeln('Server stopped!'); done(true); }); child.stdout.pipe(process.stdout); child.stderr.pipe(process.stderr); }); 

这是watch任务的configuration:

 watch: { all: { files: ['some/files/*.js'], tasks: ['default'], options: { spawn: true, interrupt: true, reload: true, } } } 

当任务重新启动时,服务器由于“EADDRINUSE”exception而失败,我认为这是因为之前的subprocess没有释放它正在使用的端口,这很奇怪 – 我看到“服务器停止! “ 信息。 我已经试过这三个选项的所有组合,我看了gruub页面grunt-contrib-watch,没有什么显示任何东西。 在下一个尝试启动之前,如何让中断的node.js进程closures所有资源?

是否有必要执行一个subprocess产卵? 在任何情况下,我已经创build了一个服务器,我只是做了这样的事情:

grunt.registerTask('runServer','启动服务器',require('./ server'));

手表任务与您列出的相同。 只要不是subprocess,Grunt就会自动杀死该任务的前一次运行。 这似乎对我来说很好。

但是,如果你需要产生一个subprocess,然后杀死它:

 var spawn = require('child_process').spawn, server = undefined; ... grunt.registerTask('runServer', 'Starts the server.', function(){ grunt.log.writeln('Starting server...'); if (server) server.kill('SIGUSR2'); server = spawn('node', ['server.js'], {stdio: 'inherit'}); } ... grunt.registerTask('default', ['runServer']);