У меня есть эта задача Rake, которая работает локально:Heroku 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
Обратите внимание, что она делает вызов, чтобы запустить скрипт. Вот что сценарий оболочки:
#!/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
выполняются немедленно, что указывает на то, что системные вызовы и сценарий оболочки не запускаются.
Я смущен, почему это не работает!
UPDATE 7/15
Я обнаружил, что вы можете установить переменную окружения PGPASSWORD
и избежать создания файла .pgpass
. Задача Rake по-прежнему не выполняет сценарий оболочки.
Спасибо, что ответили Китом. Это то, что я думал, что проблема была вначале, но я запустил «heroku run bash», чтобы получить приглашение оболочки, и выполнил мою задачу рейка с помощью 'rake backup_to_s3: run'. Затем я запускал 'cat ~/.pgpass', который дал правильный результат, поэтому кажется, что он правильно записывает файл, и он длится, по крайней мере, в течение времени, которое я трачу в этом сеансе оболочки. – garrettqmartin8