Выполнение сценария оболочки через Node.js не будет работать с использованием команды gsutil для перемещения файлов в корзины Google Cloud Storage.

Я пытаюсь переместить каталог Ubuntu 17.10.1 в корзину облачного хранилища Google через приложение node js. Я решил выполнить сценарий оболочки с использованием модуля дочернего процесса. Скрипт выглядит так.

#!/bin/bash

echo START $1
declare -r MODEL_NAME=$1
declare -r PROJECT_ID=XXX-XXXX
declare -r JOB_NAME="${MODEL_NAME}_$(date +%Y%m%d_%H%M%S)"
declare -r BUCKET_NAME="gs://XXX-XXXX-mlengine"
declare -r GCS_PATH="$BUCKET_NAME/$JOB_NAME"
gsutil -m cp -r ./training/$MODEL_NAME $GCS_PATH
echo ALL DONE!

Это работает должным образом при вызове с терминала.

Когда я вызываю его из своего приложения узла, он говорит, что не может найти gsutil, и возвращает ошибку. Я использую execFile child_process для внешней оболочки. Если я закомментирую строку gsutil, все будет хорошо. Я безуспешно пробовал использовать "ждать". Были произведены предыдущие попытки с модулем child_proccess_promise и сообщение об ошибке, в котором говорилось, что он не может найти gsutil.

const child = execFile('tensor_flow/file_process.sh', [trainingName], (error, stdout, stderr) => {
    if (error)  console.log(error);
    if (stderr)  console.log(stderr);    
    if (stdout) console.log(stdout);
  });

Это вызывает следующие сообщения об ошибках:

tensor_flow/file_process.sh: line 12: gsutil: command not found
training-prep.js:26
tensor_flow/file_process.sh: line 14: wait: `PID': not a pid or valid job spec
START T2
training-prep.js:27
ALL DONE!

Любая помощь или понимание будут оценены или ... если бы вы могли указать мне на «переместить каталог в корзину» напрямую через узел, я хотел бы знать об этом.

Спасибо, JJ

PS. Я выполнил все вышеперечисленное в ходе этих усилий, и я сделал это с и без материала wait / PID.


person jack johnson    schedule 08.02.2018    source источник
comment
Ваша проблема в gsutil: command not found. Возможно, потому что (1) gsutil не существует на сервере Google Cloud или (2) путь не найден. Если 2, вам необходимо указать абсолютный путь к gsutil.   -  person ariefbayu    schedule 08.02.2018
comment
Спасибо за попытку. В конце концов оказывается, что мне нужно запустить код с терминала, чтобы заставить его работать в моем каталоге проекта. В противном случае у него есть среда, в противном случае - среда из пользовательского интерфейса Ubuntu.   -  person jack johnson    schedule 10.02.2018


Ответы (1)


Если вы используете NODE.js, вы можете использовать узел облачного хранилища Google Библиотека .js.

Для загрузки следует использовать метод createWriteStream файл в корзину GCS:

var fs = require('fs');
var storage = require('@google-cloud/storage')();
var myBucket = storage.bucket('my-bucket');

var file = myBucket.file('my-file');

//-
// <h4>Uploading a File</h4>
//
// Now, consider a case where we want to upload a file to your bucket. You
// have the option of using {@link Bucket#upload}, but that is just
// a convenience method which will do the following.
//-
fs.createReadStream('/Users/stephen/Photos/birthday-at-the-zoo/panda.jpg')
  .pipe(file.createWriteStream())
  .on('error', function(err) {})
  .on('finish', function() {
    // The file upload is complete.
  });

Если вы хотите выполнить параллельную загрузку с помощью команды gsutil, выполняемой node.js, вы можете выполнить эту ветку. Там я объединил третье решение от @hexacyanide с официальными gsutil docs и это сработало для меня:

const { exec } = require('child_process');
exec('gsutil -m cp -r /full_path_to_your_directory gs://your-bucket', (err, stdout, stderr) => {
 if (err) {
   // node couldn't execute the command
   return;
 }
 // the *entire* stdout and stderr (buffered)
 console.log(`stdout: ${stdout}`);
 console.log(`stderr: ${stderr}`);
});

Пакет child_process - это собственный модуль Node.js.

person VictorGGl    schedule 13.02.2018
comment
Моя проблема в том, что у меня есть сотни видео, и я хотел объединить усилия. Знаете ли вы о функции загрузки каталога в корзину, которую я могу использовать в узле? - person jack johnson; 15.02.2018
comment
@jackjohnson Я отредактировал ответ, добавив, как вы можете выполнять параллельную загрузку с помощью команды gsutil и nodejs - person VictorGGl; 16.02.2018