Понимание модуля child_process и функциональности exec при его использовании для выполнения файла - PullRequest
0 голосов
/ 24 мая 2019

Я новичок в node.js и пытаюсь понять синтаксис и то, что происходит построчно в моем коде.Этот код запускает файл hello.js с одним аргументом arg1 и занимает некоторое время для выполнения.Файловая консоль выводит текущую команду, с которой она работает, каждые несколько секунд.Я хотел бы знать:

1) как остановить запуск файла (прервать в случае проблемы);

2) как передать текущую команду, что файл выходит из консоли, обратно на сторону клиента;

3) что за «дитя»;часть синтаксиса и '.on (' часть их синтаксиса делает. Спасибо куча.

Этот код выполняется на стороне сервера, инициируемой JQuery POST со стороны клиента. Сторона клиента отправляет параметрна стороне сервера, и сервер передает этот параметр в качестве аргумента в файл и запускает его. Пока файл работает, он использует console.log для вывода информации каждые несколько секунд.

Я хочу передать этоИнформация возвращается к посту jQuery в режиме реального времени, поэтому каждая команда может находиться в режиме реального времени на стороне клиента. Я также не понимаю часть кода .on ('data',) '. Имеет ли значение .on«по завершении» или «далее делать это», а также я не понимаю часть синтаксиса «.exec, child;».

var myExecute = require('child_process').exec, child;

var shellScript = myExecute('node hello.js arg1'); //run a file with an argument

shellScript.stdout.on('data', (data)=>{
      console.log(data);//file output console logs appearing here in real time                
});
shellScript.stderr.on('data', (data)=>{ 
      console.error(data);
});```

I am not getting any error messages. Currently the file is running and accepting the argument param passed in. I want to be able to abort this process from the client side once it had begun and I want to get back the data that the file is console logging and pass it back to the client side jQuery POST in real time.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Вы можете создать функцию и передать обратный вызов, чтобы при возникновении события data просто передать ее обратному вызову. stdout [неправильный выбор имени] в данном случае обратный вызов.

const executeCommand = (cmd, finish, stdout) => {
      console.log(`cmd : ${cmd}`);

      let proc = child.exec(cmd);
      proc.stdout.on('data', function(data) {
        if (stdout)
          stdout(data);
      });
      proc.stderr.on('data', function(data) {
        console.log(`stderr - ${data}`);
        proc.kill();
      });
      proc.on('close', function(code) {
         finish(code);
      });
    }

Вы можете вызвать этот метод сейчас.

let command = 'ls -la'; // sample
executeCommand(command, function(code) {
         // this one is invoked when *close* event is emitted from child process
        //code === 0 meaning it ran fine.
        if(code === 255) {
          // meaning SSH connection was not successful
          return reject(new Error('Error in establishing SSH connection'));
        }
        return resolve(`message`);
      }, function(data) {
          // you get back the data here
          // can check for certain value
      });

Я не совсем уверен, можете ли вы отправить данные в пост-метод JQuery, так как он будет выполняться в отдельном процессе, но вы можете использовать сокет для широковещательной передачи в комнату или передачи этих данных конкретному клиенту сокета.

0 голосов
/ 24 мая 2019

1) как остановить запуск файла (прервать в случае проблемы);

Чтобы остановить дочерний процесс, вы используете функцию kill (), в вашем случае это будет примерно так: shellScript.kill();

2) как передать текущую команду, что файл выходит из консоли, обратно на сторону клиента;

Вы не предоставляете много контекста в этом отношении, но вы должны использовать обратный вызов для stdout (см. Пример ниже)

3)что за "дитя";часть синтаксиса и '.on (' часть их синтаксиса делает.

child в вашем примере - это просто переменная, и, если я угадаю, она естьтолько потому, что код был скопирован и вставлен. Если бы мне пришлось угадывать снова, я скажу, что child предназначался для использования в качестве ссылки на дочерний процесс, но вместо этого вы выбрали shellScript.Имейте в виду, что не рекомендуется объявлять переменные в том же месте, где выполняется импорт, это сбивает людей с толку!

Часть .on - это способ подписаться на события, в этом случае вы подписываетесь настандартный вывод и стандартная ошибка дочернего процесса. Это означает, что всякий раз, когда процесс записывает что-то в stdout / stderr, эта функция вызывается (это не совсем точно, данные буферизуются).

копия вашего кода с некоторыми комментариями, надеюсь, теперь это будет иметь больше смысла.

// import child_process API
var myExecute = require('child_process').exec;

// I think this is a proper use of child
var child = myExecute('node hello.js arg1');

// do something anytime there's data to read
child.stdout.on('data', (data)=>{
    console.log('STDOUT from child process: ', data);

    // TODO: Send data back to client side
});

// do something when the process writes to stderr
// Note: console.log() writes to stdout, console.error() writes to stderr
child.stderr.on('data', (data)=>{ 
    console.error('error detected: ', data);
    // kill child process
    child.kill();

    // TODO: Send error data to client
});

В качестве личной заметки я скорее импортирую только child_process, а затем cal child_process.exec, на всякий случай, если мне нужноАнофэй функция позже.Как это:

var child_process = require('child_proces');

var child = child_process.exec(...)
...