Tengo un trabajo cron en un Ubuntu Hardy VPS que solo funciona a medias y no sé por qué. El trabajo es un script de Ruby que usa mysqldump para realizar una copia de seguridad de una base de datos MySQL utilizada por una aplicación de Rails, que luego se descomprime y se carga en un servidor remoto utilizando SFTP.¿Por qué mi trabajo de Cron no funciona correctamente?
El archivo gzip se crea y se copia con éxito, pero siempre es de cero bytes. Sin embargo, si ejecuto el comando cron directamente desde la línea de comandos, funciona perfectamente.
Este es el trabajo de cron:
PATH=/usr/bin
10 3 * * * ruby /home/deploy/bin/datadump.rb
Ésta es datadump.rb:
#!/usr/bin/ruby
require 'yaml'
require 'logger'
require 'rubygems'
require 'net/ssh'
require 'net/sftp'
APP = '/home/deploy/apps/myapp/current'
LOGFILE = '/home/deploy/log/data.log'
TIMESTAMP = '%Y%m%d-%H%M'
TABLES = 'table1 table2'
log = Logger.new(LOGFILE, 5, 10 * 1024)
dump = "myapp-#{Time.now.strftime(TIMESTAMP)}.sql.gz"
ftpconfig = YAML::load(open('/home/deploy/apps/myapp/shared/config/sftp.yml'))
config = YAML::load(open(APP + '/config/database.yml'))['production']
cmd = "mysqldump -u #{config['username']} -p#{config['password']} -h #{config['host']} --add-drop-table --add-locks --extended-insert --lock-tables #{config['database']} #{TABLES} | gzip -cf9 > #{dump}"
log.info 'Getting ready to create a backup'
`#{cmd}`
# Strongspace
log.info 'Backup created, starting the transfer to Strongspace'
Net::SSH.start(ftpconfig['strongspace']['host'], ftpconfig['strongspace']['username'], ftpconfig['strongspace']['password']) do |ssh|
ssh.sftp.connect do |sftp|
sftp.open_handle("#{ftpconfig['strongspace']['dir']}/#{dump}", 'w') do |handle|
sftp.write(handle, open("#{dump}").read)
end
end
end
log.info 'Finished transferring backup to Strongspace'
log.info 'Removing local file'
cmd = "rm -f #{dump}"
log.debug "Executing: #{cmd}"
`#{cmd}`
log.info 'Local file removed'
He comprobado y doble comprobado todos los caminos y son correctos. Tanto sftp.yml (credenciales SFTP) como database.yml (credenciales de MySQL) son propiedad del usuario ejecutante (implementación) con permisos de solo lectura para ese usuario (chmod 400). Estoy usando las versiones 1.1.x de net-ssh y net-sftp. Sé que no son los últimos, pero son lo que estoy familiarizado en este momento.
¿Qué podría estar causando el error de la tarea cron?