【问题标题】:How to release resources from processes killed by grunt-contrib-watch?如何从被 grunt-contrib-watch 杀死的进程中释放资源?
【发布时间】:2014-08-04 18:02:55
【问题描述】:

每当某些文件发生更改时,我正在尝试使用模块 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”异常而失败,我的意思是因为之前的子进程没有释放它正在使用的端口,这很奇怪 - 我确实看到了“服务器停止了!”信息。我已经尝试了这三个选项的所有组合,我查看了 grunt-contrib-watch 的 github 页面,但没有显示任何内容。如何让中断的 node.js 进程在下一个尝试启动之前关闭其所有资源?

【问题讨论】:

    标签: node.js gruntjs grunt-contrib-watch


    【解决方案1】:

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

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

    【讨论】:

    • 这不起作用;服务器立即退出。我不知道为什么调用require 不起作用,但调用server.listen 会立即返回。
    • 我相信你必须对你的 server.js 进行一些不同的配置才能让它工作(例如 module.exports 将必须返回一个作为 grunt 任务工作的函数)。您能否发布您的server.js 的要点?
    • 我可以,但不幸的是,在生产中根本没有使用 grunt,服务器必须能够以node server.js 启动。每次更改文件时,我可能都会回到 C-c :(
    • 我更新了答案中的代码以显示如何触发node server.js。让我知道这是否有效。
    • 另一条评论,很抱歉在这里向您发送垃圾邮件,如果您还在 JS 代码中生成了一个单独的进程,您可以在监视任务中将 spawn 设置为 false。
    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2010-12-08
    • 2011-09-05
    • 2017-06-12
    • 2023-03-12
    相关资源
    最近更新 更多