ich diesen Rake Aufgabe haben, die lokal funktioniert:Heroku Rake Aufgabe ausgeführt Shell-Skript nicht
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
Beachten Sie, dass es einen Anruf tätigt ein Shell-Skript auszuführen. Hier ist der Shell-Skript:
#!/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
Wie ich schon sagte, dies alles vor Ort arbeitet, und die puts
Logging-Anweisungen arbeiten. Auf Heroku wird die Task ausgeführt, aber die Anweisungen puts
werden sofort ausgeführt, was darauf hindeutet, dass die Systemaufrufe und das Shell-Skript nicht ausgeführt werden.
Ich bin verwirrt, warum das nicht funktioniert!
UPDATE 15.07
fand ich, dass Sie die PGPASSWORD
Umgebungsvariable und die .pgpass
-Datei erstellen vermeiden. Die Rake-Task führt das Shell-Skript immer noch nicht aus.
Vielen Dank für die Beantwortung von Keith. Das war es, was ich zuerst dachte, aber ich habe 'heroku run bash' ausgeführt, um zu einer Shell-Eingabeaufforderung zu gelangen, und meine Rake-Aufgabe mit 'rake backup_to_s3: run' ausgeführt. Ich habe dann 'cat ~/.pgpass' ausgeführt, was die korrekte Ausgabe lieferte, also scheint es, als würde die Datei korrekt geschrieben werden und es dauert mindestens die Zeit, die ich in dieser Shell-Sitzung verbringe. – garrettqmartin8