2016-07-14 70 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