首页 > 解决方案 > 通过 pm2 从 nodejs 应用程序运行终端命令

问题描述

我只有一条路线express serverpm2

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

和一个监听“open youtube”的 socket.io 事件处理程序(来自先前发送的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...');
  });
});

虽然一切正常,但在 express 服务器上处理 emit 时,唯一有效的部分是( )console.log()而不是exec()( const exec = require('child_process').exec;)

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

编辑:

当我使用 npm start 而不是作为 pm2 进程运行服务器时,它会使用 youtube.com 打开一个新选项卡(如预期的那样)

编辑2:

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

标签: javascriptnode.jsterminalsocket.iopm2

解决方案


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

推荐阅读