Google cloud storage 如何从crontab正确运行gsutil?

Google cloud storage 如何从crontab正确运行gsutil?,google-cloud-storage,gsutil,Google Cloud Storage,Gsutil,这是我在CentOS 6.6的/etc/crontab中的条目: 0 0 */1 * * fredrik /home/fredrik/google-cloud-sdk/bin/gsutil -d -m rsync -r -C [src] [dst] &> [log] 我得到了这个错误:OSError:[Errno 13]权限被拒绝:'/.config' 如果在shell中执行,该命令运行良好。我注意到如果没有gsutil的完整路径,我无法运行0*/1**fredrik gsuti

这是我在CentOS 6.6的/etc/crontab中的条目:

0 0 */1 * * fredrik /home/fredrik/google-cloud-sdk/bin/gsutil -d -m rsync -r -C [src] [dst] &> [log]
我得到了这个错误:
OSError:[Errno 13]权限被拒绝:'/.config'

如果在shell中执行,该命令运行良好。我注意到如果没有gsutil的完整路径,我无法运行
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'
回溯(最近一次呼叫最后一次):
文件“/home/fredrik/googlecloudsdk/bin/bootstrapping/gsutil.py”,第68行,在
bootstrapping.PrerunChecks(can\u be\u gce=True)
文件“/home/fredrik/googlecloudsdk/bin/bootstrapping/bootstrapping.py”,第279行,在预运行检查中
选中CredorExit(can\u be\u gce=can\u be\u gce)
文件“/home/fredrik/googlecloudsdk/bin/bootstrapping/bootstrapping.py”,第167行,在CheckCredOrExit中
cred=c_store.Load()
文件“/home/fredrik/google cloud sdk/bin/bootstrapping/./../lib/googlecloudsdk/core/credentials/store.py”,第195行,已加载
account=properties.VALUES.core.account.Get()
Get中的文件“/home/fredrik/google cloud sdk/bin/bootstrapping/./../lib/googlecloudsdk/core/properties.py”,第393行
return _GetProperty(self,_PropertiesFile.Load(),必选)
文件“/home/fredrik/google cloud sdk/bin/bootstrapping/./../lib/googlecloudsdk/core/properties.py”,第618行,位于_GetProperty中
value=callback()
文件“/home/fredrik/googlecloudsdk/bin/bootstrapping/./../lib/googlecloudsdk/core/properties.py”,第286行,在
“account”,回调=[lambda:c_gce.Metadata().DefaultAccount()])
元数据中的文件“/home/fredrik/google cloud sdk/bin/bootstrapping/./../lib/googlecloudsdk/core/credentials/gce.py”,第179行
_元数据\u lock.lock(函数=\u CreateMetadata,参数=无)
文件“/usr/lib64/python2.6/mutex.py”,第44行,处于锁定状态
函数(参数)
文件“/home/fredrik/google cloud sdk/bin/bootstrapping/./../lib/googlecloudsdk/core/credentials/gce.py”,第178行,在
_元数据=_GCEMetadata()
文件“/home/fredrik/google cloud sdk/bin/bootstrapping/./../lib/googlecloudsdk/core/credentials/gce.py”,第73行,在__
_CacheIsOnGCE(自连接)
文件“/home/fredrik/google cloud sdk/bin/bootstrapping/./../lib/googlecloudsdk/core/credentials/gce.py”,第186行,在_CacheIsOnGCE中
将.path().GCECachePath()配置为gcecache_文件:
OpenForWritingPrivate中的文件“/home/fredrik/google cloud sdk/bin/bootstrapping/./../lib/googlecloudsdk/core/util/files.py”,第465行
MakeDir(完整父目录路径,模式=0700)
MakeDir中的文件“/home/fredrik/google cloud sdk/bin/bootstrapping/./../lib/googlecloudsdk/core/util/files.py”,第44行
os.makedirs(路径,模式=模式)
makedirs中的文件“/usr/lib64/python2.6/os.py”,第150行
makedirs(头部,模式)
makedirs中的文件“/usr/lib64/python2.6/os.py”,第157行
mkdir(名称、模式)
OSError:[Errno 13]权限被拒绝:'/.config'

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

gsutil -D ls 2>&1 | grep config_file_list   
发生这种情况的原因是cron在运行作业之前会取消设置大多数环境变量,因此您需要在运行gsutil之前在cron脚本中手动设置BOTO_CONFIG环境变量,即:

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

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

感谢Mike和jterrace帮助我完成这项工作。最后,我不得不修改这些环境变量:PATH、HOME、BOTO_CONFIG(除了其他默认变量)

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


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

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

创建了一个名为apachesharedchgrp/chown'dwww-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');

因为cron是在一个非常有限的环境中运行的,所以需要对.bash_配置文件进行源代码设计,以获得环境配置

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

由于原始问题,我无法从crontab运行
gsutil-dls2>&1 | grep config_file_list
<代码>操作错误:[Errno 13]权限被拒绝:'/.config'。我添加了
BOTO_CONFIG=“/home/fredrik/.CONFIG/gcloud/legacy_凭据/fredrik@mydomain.com/.boto“
(这是在shell中以用户“fredrik”的身份运行建议的命令的结果)到/etc/crontab,我还将GCE SDK bin文件夹添加到PATH。但我还是得到了和我最初的帖子一样的错误。这个cron命令被指定由用户“fredrik”执行,而不是root。我终于让它工作了。见我的问题答案中的总结。谢谢是的,就是这样!我会根据你的答案和迈克的答案为我的问题写一个简短的答案摘要。谢谢你下面的标准答案。很高兴你能让它工作!
* * * * * source ~/.bash_profile && your_cmd_here