每当某些文件发生更改时,我都会尝试使用模块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: {
all: {
files: ['some/files/*.js'],
tasks: ['default'],
options: {
spawn: true,
interrupt: true,
reload: true,
}
}
}当任务重新启动时,服务器会因为"EADDRINUSE“异常而失败,我的意思是前一个子进程没有释放它正在使用的端口,这很奇怪--我确实看到了"Server stopped!”消息。我已经尝试了这三个选项的所有组合,我在github页面上查看了grunt-contrib watch,但没有显示任何内容。如何让中断的node.js进程在下一个进程尝试启动之前关闭所有资源?
发布于 2014-08-05 02:14:02
是否有必要执行子进程派生?在我启动服务器的每一种情况下,我都简单地做了这样的事情:
grunt.registerTask('runServer',‘启动服务器。’,require('./server'));
监视任务仍然与您列出的任务相同。只要该任务不是子进程,Grunt就会自动终止该任务的前一次运行。这对我来说似乎工作得很好。
但是,如果您需要派生一个子进程,然后终止它:
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']);https://stackoverflow.com/questions/25124795
复制相似问题