Я пытаюсь запустить скрипт Python из скрипта оболочки в определенное время.Сценарий оболочки запускает несколько команд для генерации некоторых файлов в каталоге, а скрипт python загружает все файлы в каталоге в Google Cloud Storage Bucket.
Я автоматизировал этот сценарий оболочки с помощью crontab.
Сценарий python gsutil.py выглядит примерно так:
from google.cloud import storage
import os
def upload(storage_client, file_path, blob_name):
bucket = storage_client.get_bucket('some-bucket')
blob = bucket.blob(blob_name)
blob.upload_from_file_name(file_path)
def walker():
rootPath = '/opt/xxx/yyy/zzz'
storageClient = storage.Client()
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
for file_ in onlyfiles:
filePath = os.path.join(root, file_)
blobName = filePath.replace(rootPath, "")
print('file - {0} and blob - {1}', filePath, blobName)
upload(storageClient, filePath, blobName)
def main():
walker()
if __name__== "__main__":
main()
Проблема, с которой я сталкиваюсь, заключается в том, что при попытке запустить сценарий оболочки с помощью bash run_script.sh это работает совершенно нормально.Но когда я пытаюсь запустить его, используя crontab , он выдает мне эту ошибку:
Traceback (most recent call last):
File "/opt/xxx/yyy/gs_py/gsutil.py", line 28, in <module>
main()
File "/opt/xxx/yyy/gs_py/gsutil.py", line 25, in main
walker()
File "/opt/xxx/yyy/gs_py/gsutil.py", line 21, in walker
upload(storageClient, filePath, blobName)
File "/opt/xxx/yyy/gs_py/gsutil.py", line 7, in upload
blob.upload_from_filename(file_path)
File "/root/.local/share/virtualenvs/gs_py-qE0GGV3s/local/lib/python2.7/site-packages/google/cloud/storage/blob.py", line 1136, in upload_from_filename
predefined_acl=predefined_acl,
File "/root/.local/share/virtualenvs/gs_py-qE0GGV3s/local/lib/python2.7/site-packages/google/cloud/storage/blob.py", line 1085, in upload_from_file
_raise_from_invalid_response(exc)
File "/root/.local/share/virtualenvs/gs_py-qE0GGV3s/local/lib/python2.7/site-packages/google/cloud/storage/blob.py", line 1956, in _raise_from_invalid_response
raise exceptions.from_http_status(response.status_code, message, response=response)
google.api_core.exceptions.Forbidden: 403 POST https://www.googleapis.com/upload/storage/v1/b/tercept-carousell/o?uploadType=multipart: (u'Request failed with status code', 403, u'Expected one of', 200)
Я что-то здесь упускаю?Я вошел в систему как пользователь root и поместил запись в crontab:
0 12 * * * bash /opt/xxx/yyy/run_script.sh >> /opt/xxx/yyy/script.log 2>&1 &
Команда, которая воссоздает описанный выше сценарий ошибки:
sudo bash run_script.sh
Я не совсем уверен, чтопроисходит и почему это не работает.Я использую только bash, он работает, и когда я пытаюсь добавить его в crontab или запустить его с помощью sudo , он не работает.Кто-нибудь может мне помочь?