首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何释放被grunt-contrib-watch杀死的进程的资源?

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

Stack Overflow用户
提问于 2014-08-05 02:02:55
回答 1查看 348关注 0票数 2

每当某些文件发生更改时,我都会尝试使用模块grunt-contrib-watch重新启动我的node.js服务器。我已经使用grunt来运行服务器、jshint和模板编译器,并且我知道这些函数是有效的。下面是启动服务器的任务:

代码语言:javascript
复制
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);
 });

下面是监视任务的配置:

代码语言:javascript
复制
watch: {
    all: {
        files: ['some/files/*.js'],
        tasks: ['default'],
        options: {
            spawn: true,
            interrupt: true,
            reload: true,
        }
    }
}

当任务重新启动时,服务器会因为"EADDRINUSE“异常而失败,我的意思是前一个子进程没有释放它正在使用的端口,这很奇怪--我确实看到了"Server stopped!”消息。我已经尝试了这三个选项的所有组合,我在github页面上查看了grunt-contrib watch,但没有显示任何内容。如何让中断的node.js进程在下一个进程尝试启动之前关闭所有资源?

EN

回答 1

Stack Overflow用户

发布于 2014-08-05 02:14:02

是否有必要执行子进程派生?在我启动服务器的每一种情况下,我都简单地做了这样的事情:

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

监视任务仍然与您列出的任务相同。只要该任务不是子进程,Grunt就会自动终止该任务的前一次运行。这对我来说似乎工作得很好。

但是,如果您需要派生一个子进程,然后终止它:

代码语言:javascript
复制
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']);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25124795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档