如何从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']);