【问题标题】:How to properly run gsutil from crontab?如何从 crontab 正确运行 gsutil?
【发布时间】:2015-02-10 21:49:30
【问题描述】:

这是我在 /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'

如果在 shell 中执行,该命令运行良好。我注意到如果没有 gsutil 的完整路径,我无法运行 0 0 */1 * * fredrik 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'

【问题讨论】:

    标签: google-cloud-storage gsutil


    【解决方案1】:

    感谢 Mike 和 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
    

    &gt; gsutil.log 2&gt;&amp;1 将 stdout 和 stderr 都通过管道传输到同一个文件。此外,它会在下次 gsutil 运行时覆盖日志文件。为了使其附加到日志文件,请使用&gt;&gt; gsutil.log 2&gt;&amp;1。这在 Linux 和 OS X 上都应该是安全的。

    我注意到调试标志 -d 会在大量数据上创建大量日志文件,因此我个人可能会选择不使用该标志。

    【讨论】:

      【解决方案2】:

      从 cron 运行时,您可能会得到不同的 boto 配置文件。请尝试以两种方式运行以下两种方式(以 root 身份,然后通过 cron),并查看两种情况下是否会获得不同的配置文件列表:

      gsutil -D ls 2>&1 | grep config_file_list   
      

      出现这种情况的原因是 cron 在运行作业之前取消设置了大部分环境变量,因此您需要在运行 gsutil 之前在 cron 脚本中手动设置 BOTO_CONFIG 环境变量,即:

      BOTO_CONFIG="/root/.boto"
      gsutil rsync ...
      

      【讨论】:

      • 由于原始问题,我无法从 crontab 运行 gsutil -D ls 2&gt;&amp;1 | grep config_file_listOSError: [Errno 13] Permission denied: '/.config'。我将BOTO_CONFIG="/home/fredrik/.config/gcloud/legacy_credentials/fredrik@mydomain.com/.boto"(这是在shell 中以用户'fredrik' 身份运行建议的命令的结果)添加到/etc/crontab,并且我还将GCE SDK bin 文件夹添加到PATH。但是我仍然遇到与我最初的帖子中相同的错误。此 cron 命令指定由用户 'fredrik' 而不是 root 执行。
      • 我终于让它工作了。在我的问题的答案中查看我的摘要。谢谢!
      【解决方案3】:

      我相信您会收到此错误,因为在 cron 下运行时未设置 HOME 环境变量。尝试设置HOME=/home/fredrik

      【讨论】:

      • 是的,就是这样!我会根据你的回答和 Mike 的回答为我的问题写一个简短的回答摘要。
      • 感谢下面的规范回答。很高兴你能够让它工作!
      【解决方案4】:

      因为 cron 在非常有限的环境中运行,您需要获取 .bash_profile 以获取您的环境配置。

      * * * * * source ~/.bash_profile && your_cmd_here
      

      【讨论】:

        【解决方案5】:

        对于任何试图通过运行 Apache 的 PHP 使用 gsutil 管理图像的人 -

        创建了一个名为 apache-sharedchgrp/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');
        

        【讨论】:

          猜你喜欢
          • 2018-09-05
          • 2013-04-07
          • 1970-01-01
          • 2015-05-25
          • 1970-01-01
          • 2018-01-13
          • 2018-12-27
          • 2017-03-22
          • 1970-01-01
          相关资源
          最近更新 更多