Как правильно запустить gsutil из crontab?

Это моя запись в /etc/crontab, CentOS 6.6:

0 0 */1 * * fredrik /home/fredrik/google-cloud-sdk/bin/gsutil -d -m rsync -r -C [src] [dst] &> [log]

И я получаю эту ошибку: OSError: [Errno 13] Permission denied: '/.config'

Команда работает нормально, если выполняется в оболочке. Я заметил, что не могу запустить 0 0 */1 * * fredrik gsutil ... без полного пути к gsutil, поэтому я предполагаю, что мне что-то не хватает в среде, в которой работает cron...?

Вот полная трассировка:

Traceback (most recent call last):
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/gsutil.py", line 68, in <module>
    bootstrapping.PrerunChecks(can_be_gce=True)
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/bootstrapping.py", line 279, in PrerunChecks
    CheckCredOrExit(can_be_gce=can_be_gce)
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/bootstrapping.py", line 167, in CheckCredOrExit
    cred = c_store.Load()
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/credentials/store.py", line 195, in Load
    account = properties.VALUES.core.account.Get()
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/properties.py", line 393, in Get
    return _GetProperty(self, _PropertiesFile.Load(), required)
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/properties.py", line 618, in _GetProperty
    value = callback()
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/properties.py", line 286, in <lambda>
    'account', callbacks=[lambda: c_gce.Metadata().DefaultAccount()])
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/credentials/gce.py", line 179, in Metadata
    _metadata_lock.lock(function=_CreateMetadata, argument=None)
  File "/usr/lib64/python2.6/mutex.py", line 44, in lock
    function(argument)
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/credentials/gce.py", line 178, in _CreateMetadata
    _metadata = _GCEMetadata()
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/credentials/gce.py", line 73, in __init__
    _CacheIsOnGCE(self.connected)
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/credentials/gce.py", line 186, in _CacheIsOnGCE
    config.Paths().GCECachePath()) as gcecache_file:
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/util/files.py", line 465, in OpenForWritingPrivate
    MakeDir(full_parent_dir_path, mode=0700)
  File "/home/fredrik/google-cloud-sdk/bin/bootstrapping/../../lib/googlecloudsdk/core/util/files.py", line 44, in MakeDir
    os.makedirs(path, mode=mode)
  File "/usr/lib64/python2.6/os.py", line 150, in makedirs
    makedirs(head, mode)
  File "/usr/lib64/python2.6/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/.config'

person fredrik    schedule 12.12.2014    source источник


Ответы (5)


Спасибо Майку и jterrace за то, что помогли мне заставить это работать. В конце концов мне пришлось пересмотреть эти переменные среды: PATH, HOME, BOTO_CONFIG (кроме любых других по умолчанию).

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/fredrik/google-cloud-sdk/bin
HOME=/home/fredrik
BOTO_CONFIG="/home/fredrik/.config/gcloud/legacy_credentials/[your-email-address]/.boto"

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

  0  0 */1 *  * fredrik   gsutil -d -m rsync -r -C /local-folder/ gs://my-bucket/my-folder/ > /logs/gsutil.log 2>&1

> gsutil.log 2>&1 направляет как stdout, так и stderr в один и тот же файл. Кроме того, он перезапишет файл журнала при следующем запуске gsutil. Чтобы добавить его в файл журнала, используйте >> gsutil.log 2>&1. Это должно быть безопасно как в Linux, так и в OS X.

Я заметил, что флаг отладки -d создает огромные файлы журналов для больших объемов данных, поэтому лично я мог бы отказаться от этого флага.

person fredrik    schedule 15.12.2014

Вы, вероятно, получаете другой файл конфигурации boto при запуске из cron. Пожалуйста, попробуйте выполнить следующие действия обоими способами (от root, а затем через cron) и посмотрите, получите ли вы разные списки конфигурационных файлов для двух случаев:

gsutil -D ls 2>&1 | grep config_file_list   

Это происходит потому, что cron сбрасывает большинство переменных среды перед запуском заданий, поэтому вам необходимо вручную установить переменную среды BOTO_CONFIG в вашем сценарии cron перед запуском gsutil, т. е.:

BOTO_CONFIG="/root/.boto"
gsutil rsync ...
person Mike Schwartz    schedule 12.12.2014
comment
Я не могу запустить gsutil -D ls 2>&1 | grep config_file_list из crontab из-за исходной проблемы; OSError: [Errno 13] Permission denied: '/.config'. Я добавил BOTO_CONFIG="/home/fredrik/.config/gcloud/legacy_credentials/[email protected]/.boto" (это результат выполнения предложенной вами команды в оболочке от имени пользователя «fredrik») в /etc/crontab, а также добавил папку bin GCE SDK в PATH. Но я все еще получаю ту же самую ошибку, что и в моем первоначальном посте. Эта команда cron предназначена для выполнения пользователем 'fredrik', а не пользователем root. - person fredrik; 12.12.2014
comment
Наконец-то я заработал. См. мое резюме в ответе на мой вопрос. Спасибо! - person fredrik; 15.12.2014

Я полагаю, что вы получаете эту ошибку, потому что переменная окружения HOME не установлена ​​при работе под cron. Попробуйте установить HOME=/home/fredrik.

person jterrace    schedule 12.12.2014
comment
Да, это было! Я напишу краткий ответ на мой вопрос, основанный на вашем ответе и ответе Майка. - person fredrik; 15.12.2014
comment
Спасибо за канонический ответ ниже. Рад, что вы смогли заставить его работать! - person jterrace; 15.12.2014

поскольку cron запускается в очень ограниченной среде, вам нужно получить свой .bash_profile, чтобы получить конфигурацию вашей среды.

* * * * * source ~/.bash_profile && your_cmd_here
person niainaLens    schedule 13.10.2020

Для тех, кто пытается управлять изображениями с помощью gsutil из PHP под управлением Apache -

Создан новый каталог с именем apache-shared и chgrp/chown'd www-data (или в зависимости от того, под каким пользователем работает ваш Apache, запустите "top" для проверки). Скопировал файл .boto в каталог и без проблем запустил следующее:

shell_exec('export BOTO_CONFIG=/apache-shared/.boto && export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/user/google-cloud-sdk/bin && gsutil command image gs://bucket');
person 4 hours later    schedule 12.10.2016