#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 не является виновником