javascript exec curl, переданный в tar, выдает ошибку

#javascript #node.js #curl #tar

#javascript #node.js #curl #tar

Вопрос:

У меня есть команда оболочки для загрузки и удаления файла, выполняемая из javascript. Когда выполняется как curl, подключенный к tar, это иногда терпит неудачу:

 const child_process = require('child_process');
var cmd = `curl -s ${file} | tar -xj --strip-components=1 --exclude=README.txt -C ${directory}`;
child_process.exec(cmd, function commandCallback(error, stdout, stderr) {
      console.log('done downloading '   type   ' bundle');
      if (error) {
        console.error('error downloading '   type   ' bundle: '   error);
        console.log(stderr);
      }
  

с такими ошибками, как

 Error: Command failed: curl -s https://dist.whosonfirst.org/bundles/whosonfirst-data-locality-latest.tar.bz2 | tar -xj --strip-components=1 --exclude=README.txt -C /mnt/storage-proc2/users/jeremy/pelias_metal/data/whosonfirst    
bzip2: Compressed file ends unexpectedly;
        perhaps it is corrupted?  *Possible* reason follows.
bzip2: Inappropriate ioctl for device
        Input file = (stdin), output file = (stdout)
  

но если команда выполняется как таковая

 var cmd=`wget -q ${file} amp;amp; tar -xj --strip-components=1 --exclude=README.txt -C ${directory} -f latest.file `;
  

Тогда все работает нормально . Кто-нибудь знает, что вызывает сбой первой команды? Передача данных непосредственно в tar может сэкономить немало времени и дискового пространства и поэтому была бы предпочтительнее.

Node.js по-видимому, возникают проблемы с заполнением буферов при длительных загрузках, если флаг -s не передается в curl, но, похоже, здесь это не проблема, поскольку флаг -s присутствует.

редактировать — похоже, javascript не является виновником:

 jeremyr@w6:~/pelias_metal/whosonfirst$ curl -s https://dist.whosonfirst.org/bundles/whosonfirst-data-postalcode-jp-latest.tar.bz2 | tar -xj --strip-components=1 --exclude=README.txt -C /mnt/data_science/pelias_w6/data/whosonfirst amp;amp; mv /mnt/data_science/pelias_w6/data/whosonfirst/whosonfirst-data-postalcode-jp-latest.csv /mnt/data_science/pelias_w6/data/whosonfirst/meta 

bzip2: Compressed file ends unexpectedly;
        perhaps it is corrupted?  *Possible* reason follows.
  

а также wget -q -O | tar действительно работает —

 jeremyr@w6:~/pelias_metal/whosonfirst$ wget -q -O - https://dist.whosonfirst.org/bundles/whosonfirst-data-postalcode-jp-latest.tar.bz2|tar -xj --strip-components=1 --exclude=README.txt -C /mnt/data_science/pelias_w6/data/whosonfirst
jeremyr@w6:~/pelias_metal/whosonfirst$

  

Комментарии:

1. Работает ли это, если вы запускаете команду из командной строки?

2. Во второй команде вы не перенаправляете вывод одной команды на другую. Проблема (я думаю) с вашей первой командой заключается в том, что вы просто не можете использовать | ее так, как в любой оболочке. Вы должны создать процесс curl и процесс tar и вручную перенаправить выходные данные процесса curl на вход процесса tar.

3. @customcommander дело в том, что это работает во многих случаях и, похоже, ломается только для больших файлов

4. @barmar хороший вопрос, я постараюсь устранить javascript как виновника

5. @barmar , см. Редактирование в вопросе — похоже, javascript не является виновником