Запустите команду tar как child_process в Node.js - PullRequest
0 голосов
/ 10 марта 2020

При попытке использовать child_process.spawn в node.js для запуска команды tar время выполнения завершается с ошибкой ENOENT. Если я запускаю его как child_process.exe c, команда запускается и возвращает одну строку вывода через обработчик событий exec.stdout.on('data'). При запуске команды в терминале она выводит больше, чем то, что возвращает exe c.

Ключевая проблема заключается в том, что с флагами -cvMf tar пользователь должен нажать enter для продолжения своего процесса, который Я надеялся сделать через exec.send

Вот выдержка из кода, который я имею:

 try {
  let subprocess = exec('tar -cvMf /dev/nst0 /mnt/Data/2GBdata1 /mnt/Data/1GBdata');

  subprocess.stdout.on('data', function (data)  {
    console.log('stdout on data: \n', data.toString());
  });
  subprocess.on('data', function(data)  {
    console.log('on data: \n', data);
  })
  subprocess.stdout.on('message', function (message)  {
    console.log('sub messgae: ', message);
  });
  subprocess.stderr.on('error', function(err) {
    console.log('sub error thrown', err);
    throw err;
  })
  subprocess.on('exit', function (data)  {
    subprocess = null;
    console.log('sub exited: \n', data);
  });

}
catch (err) {
  console.error(`exec error: ${err}`);
  output = `${err}`;
}

Вывод просто:

 stdout on data: 
 /mnt/Data/2GBdata1

stdout on data: 
 /mnt/Data/1GBdata

Затем процесс просто висит. Ожидаемый результат (при запуске команды в терминале) следующий:

tar -cvMf /dev/nst0 /mnt/Data/2GBdata /mnt/Data/1GBdata
tar: Removing leading `/' from member names
/mnt/Data/2GBdata
/mnt/Data/1GBdata
Prepare volume #2 for ‘/dev/nst0’ and hit return: 

Мой последний вариант - написать сценарий оболочки и использовать execFile, но я бы хотел избежать чрезмерно усложняющих вещей, если возможный. Любая помощь приветствуется, спасибо!

1 Ответ

0 голосов
/ 11 марта 2020

Я понял это. По какой-то причине строка Prepare volume #2 for ‘/dev/nst0’ and hit return: не регистрируется как сильное событие. Однако после дальнейших исследований я обнаружил, что tar имеет флаг -F, , который позволяет вам определить скрипт, который будет запущен, когда он достигнет конца ленты. Я написал простой сценарий оболочки, который выводит эхо при достижении конца ленты, который затем регистрируется как событие stdout. Благодаря этому я смог продолжить свой проект без каких-либо хлопот. Команда теперь выглядит так:

tar -F './tartest.sh' -cvMf /dev/nst0 '(data files here)'
...