当Grunt退出时杀死产生的进程

时间:2013-04-24 17:20:35

标签: gruntjs

我目前正在尝试执行几个步骤,这些步骤需要将任务生成到子进程中。例如:

  1. 观看文件
  2. 启动我的静态站点生成器的预览服务器
  3. 我可以轻松使用grunt-concurrent之类的任务同时运行这两项任务。但是,当我退出grunt时,子进程(在这种情况下 - 我使用grunt-shell运行的静态站点生成器)继续运行。我想让这些任务同时运行 - 但是当grunt退出时也会让它们被杀死。

    思想?

5 个答案:

答案 0 :(得分:1)

不确定grunt-shell是如何工作的。但是,如果你设置一个自定义的grunt任务来运行你的服务器,你可以尝试像:

  var spawn = require('child_process').spawn;
  var server = spawn('myserver', ['--foo']);
  process.on('exit', function() {
     grunt.log.writeln('killing myserver...');
     server.kill();
     grunt.log.writeln('killed myserver');
  });

答案 1 :(得分:0)

有什么理由不使用grunt-contrib-connect在项目根目录中启动服务器?

如果可能,请执行此操作而不是使用grunt-shell,并且当您的grunt进程退出时服务器将自动关闭

答案 2 :(得分:0)

也许这就是创建grunt-exit的原因。

答案 3 :(得分:0)

显然,grunt-shell无法处理process退出事件:https://github.com/sindresorhus/grunt-shell/blob/master/tasks/shell.js

因此,我怀疑你的grunt进程正在退出,grunt-shell永远不会警告它的子进程父进程正在停止。

例如,grunt-concurrent会杀死它的子进程,我们可以在这里看到:

process.on('exit', function () {
    cpCache.forEach(function (el) {
        el.kill();
    });
});

来源:https://github.com/sindresorhus/grunt-concurrent/blob/master/tasks/concurrent.js#L55

所以,使用grunt-shell不会为你工作。

一种解决方案是在Gruntfile中要求wintersmith并在自定义任务中以编程方式运行它。

答案 4 :(得分:0)

请参阅https://stackoverflow.com/a/32057486/626810上的答案。

当您有一个明确需要调用的脚本时(例如:当该进程被守护进程时),这非常有用。