2012-07-25 68 views
2

为我的最新项目使用cli工具。我正在编写一个停止方法,并试图根据其pid来终止节点进程。在节点可执行文件中返回错误的pid

这是我的代码,但它看起来像我只得到的PID的grep功能

#!/usr/bin/env node 

(function() { 
var args = process.argv.slice(2), 
    exec = require('child_process').exec; 

args.forEach(function (arg) { 
    switch (arg) { 
     case 'start': 
      require('./library/Ubui'); 
      return; 
     break; 
     case 'stop': 
      //I am aware this will kill the grep instance too 
      //but I don't care. Why should we? 
      exec('ps aux | grep ubui.js | cut -c11-15', function (a, b) { 
       var ubuifs = b.split("\n"); 
       console.log(ubuifs); 
       ubuifs.forEach(function (pid) { 
        if (pid !== '') { 
         console.log('\x1b[33mAttempting to kill process pid: ' + pid + '\x1b[0m'); 
         exec('kill ' + pid, function (a, b) { 
          console.log(a, b); 
         }); 
        } 
       }); 
      }); 
     break; 
    } 
}); 
})(); 

如果任何人有任何的想法,你可以在这里回答或做在github上here pull请求并解释它为什么不起作用?如果我能做到这一点,这将是一个非常方便的cli工具!

干杯

+0

感谢编辑nfechner,我没有发现那个错误 – 2012-07-25 09:31:56

回答

2

这是一个黑客,但它的工作原理。

在mac和linux上,我必须根据应用程序向exec'd PID添加+1或+2,无法弄清楚它为什么是1或2,似乎不依赖于节点版本或操作系统。对于给定的应用程序,偏移总是相同的,我可以肯定地说。

有趣的是,使用child.spawn不需要调整。

这解决了您的问题,但没有解决根本原因。如果有人知道child.exec中的偏移量是多么的棒。

+0

这将是因为'exec'启动一个shell然后运行这些命令,而'spawn'使用这个命令启动一个新的进程。 – Ash 2017-05-10 14:04:43

相关问题