【问题标题】:Heroku Rake task not running shell scriptHeroku Rake 任务未运行 shell 脚本
【发布时间】:2016-11-17 15:24:17
【问题描述】:

我有这个在本地工作的 Rake 任务:

namespace :backup_to_s3 do
  task run: :environment do
    puts "Started S3 backup"
    # create .pgpass so we don't have to enter the password
    entry = "#{ENV['RDS_DB_HOSTNAME']}:*:*:#{ENV['RDS_DB_SUPER_USERNAME']}:#{ENV['RDS_DB_SUPER_PASSWORD']}"
    `echo '#{entry}' > ~/.pgpass;
    chmod 0600 ~/.pgpass;
    bash backup_to_s3.sh`
    puts "Finished S3 backup"
  end
end

请注意,它会调用以运行 shell 脚本。这是那个 shell 脚本:

#!/bin/bash

backupTime=`date +%Y%m%d-%H:%M`
S3Bucket=$S3_BUCKET_NAME
RDSHostname=$RDS_DB_HOSTNAME
RDSUsername=$RDS_DB_SUPER_USERNAME
RDSDatabaseName=$RDS_DB_NAME

pg_dump -Fc ${RDSDatabaseName} -h ${RDSHostname} -U ${RDSUsername} --no-password | gzip -9 | \
s3cmd put - s3://${S3Bucket}/postgres.${RDSDatabaseName}.dump.${backupTime}.gz

就像我说的,这一切都在本地工作,puts 日志语句工作。在 Heroku 上,任务运行,但 puts 语句立即执行,似乎表明系统调用和 shell 脚本没有运行。

我很困惑为什么这不起作用!

7/15 更新

我发现您可以设置PGPASSWORD 环境变量并避免创建.pgpass 文件。 Rake 任务仍未执行 shell 脚本。

【问题讨论】:

    标签: ruby-on-rails ruby shell heroku rake


    【解决方案1】:

    Heroku 没有为您提供传统的虚拟专用服务器,因此我不会假设您有权写入主目录。在创建.pgpass 文件时,您很可能会遇到权限被拒绝错误。

    尝试将您的文件放在您的 rails 项目的相对 tmp/ 目录中。

    【讨论】:

    • 感谢您回答基思。这就是我最初认为的问题所在,但我运行 heroku run bash 以进入 shell 提示符,并使用 rake backup_to_s3:run 运行我的 rake 任务。然后我运行了cat ~/.pgpass,它给出了正确的输出,所以看起来它正在正确地写入文件并且它至少持续了我在那个shell会话中花费的时间。
    猜你喜欢
    • 2013-02-18
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多