Запустите команду терминала из приложения nodejs через pm2 - PullRequest
0 голосов
/ 17 ноября 2018

У меня express server работает под pm2 только с одним маршрутом:

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

и обработчиком события socket.io, который прослушивает «open 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...');
  });
});

Пока все работает, когда emit обрабатывается на экспресс-сервере, единственная работающая часть - это console.log(), а не exec() (const exec = require('child_process').exec;)

По какой причине pm2 не позволяет мне запускать команду cmd и / или как я могу запустить команду cmd из nodejs приложения, работающего под pm2?

РЕДАКТИРОВАТЬ:

Когда я запускаю сервер с запуском npm, а не как процесс pm2, он открывает новую вкладку (как и ожидалось) с youtube.com

РЕДАКТИРОВАТЬ 2:

Дляпо какой-то причине, после того как я запустил pm2, перезагрузил ecosystem.config.js и pm2 save, все заработало.Единственное изменение, которое я сделал в ecosystem.config.js, было изменение exec_mode на exec_mode: 'cluster' вместо fork, который является значением по умолчанию.
Я не знаю, была ли это причина или нет.

1 Ответ

0 голосов
/ 17 ноября 2018

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
...