javascript - 通过 pm2 从 nodejs 应用程序运行终端命令

标签 javascript node.js terminal socket.io pm2

我有一个express server运行于 pm2只有一条路线:

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 后,它确实起作用了。我对 Ecosystem.config.js 所做的唯一更改是将 exec_mode 更改为 exec_mode: 'cluster' 而不是默认值 fork。
不知道是不是这个原因。

最佳答案

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

关于javascript - 通过 pm2 从 nodejs 应用程序运行终端命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53353200/

相关文章:

node.js - 来自 Node JS 的 HTTPS REST API 调用类型错误 : First argument must be a string or Buffer

ubuntu - 获取少于 50 位字符的行并显示 csv 文件中的行号

java - 具有奇怪行为的正则表达式

javascript - 使用新(2020 年秋季)界面下载 FKI IAM 手写数据库文件

javascript - 如何在一定时间后强制提交表单?

linux - echo 3 >/proc/sys/vm/drop_caches 在 Mac OSX 上

macos - 我的Sublime首选项文件在哪里?

javascript - 如何使用 taggingjs 避免空白初始化

javascript - 使用 Azure 无服务器函数 req.body 返回 HTML

node.js - 为什么 NodeJS 域文档代码尝试终止该进程?