通过pm2从nodejs应用运行终端命令

时间:2018-11-17 16:32:24

标签: javascript node.js terminal socket.io pm2

我有一个express serverpm2下运行,只有一条路线:

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html);
}

和一个socket.io事件处理程序,该事件处理程序侦听“打开的youtube”(来自先前发送的index.html

io.on('connection', function(socket){
  socket.on('open youtube', function() {
    exec('start chrome youtube.com'); //yes ik, this is a windows-only solution
    console.log('Opening youtube...');
  });
});

虽然一切正常,但在快递服务器上处理了辐射后,唯一起作用的部分是console.log()而不是exec()const exec = require('child_process').exec;

pm2不允许我运行cmd命令的原因是什么,和/或如何从cmd下运行的nodejs应用程序运行pm2命令是什么原因? 1}}?

编辑:

当我使用npm start而不是pm2进程运行服务器时,它将通过youtube.com打开一个新标签页(如预期的那样)

编辑2:

由于某种原因,我运行pm2 reload生态系统.config.js和pm2保存后,它确实起作用了。我对ecosystem.config.js所做的唯一更改是将exec_mode更改为exec_mode:'cluster'而不是默认值fork
。 我不知道这是不是原因。

1 个答案:

答案 0 :(得分:1)

exec(String)是一个异步函数, 您可能有一个自己不知道的错误,请传递这样的回调:

exec('start chrome youtube.com', (error, stdout, stderr) => {
  if (error) {
    // handle error
  } else {
    // handle success
  }
});

您还可以使用同步版本

try {
  let res = execSync('start chrome youtube.com');
} catch(err){
  // handle error
  return;
}
// handle success