2016-07-14 61 views
0

我有这个Rake任务是本地工作:Heroku的Rake任务不运行shell脚本

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脚本没有运行。

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

UPDATE 7/15

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

回答

0

Heroku不会为您提供传统的虚拟专用服务器,所以我不会认为您有权写入主目录。在创建.pgpass文件时,很可能您会获得权限被拒绝的错误。

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

+0

感谢您回答基思。这就是我一开始认为这个问题,但我运行'heroku run bash'来进入shell提示符,并用'rake backup_to_s3:run'运行我的rake任务。然后我运行了'cat〜/ .pgpass',它给出了正确的输出,所以它看起来好像是正确写入文件,并且至少在我花在shell会话中的时间至少持续了。 – garrettqmartin8