Pregunta

Tengo un cron job en Ubuntu Hardy VPS que sólo la mitad trabaja y yo no se puede averiguar por qué.El trabajo es un script en Ruby que utiliza mysqldump para copia de seguridad de una base de datos MySQL utilizada por una aplicación Rails, que luego es comprimida con gzip y subido a un servidor remoto usando SFTP.

El gzip archivo es creado y copiado con éxito, pero siempre de cero bytes.Sin embargo, si puedo ejecutar el cron de comandos directamente desde la línea de comandos que funciona a la perfección.

Esta es la tarea en el cron:

PATH=/usr/bin
10 3 * * * ruby /home/deploy/bin/datadump.rb

Este 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'

Lo he comprobado y verificado que todos los caminos y son correctos.Ambos sftp.yml (SFTP credenciales) y la base de datos.yml (Credenciales de MySQL) son propiedad del usuario que está ejecutando (implementar) con permisos de sólo lectura para el usuario (chmod 400).Estoy usando la 1.1.x versiones de net-ssh y sftp.Sé que no están a la última, pero son las que estoy familiarizado con en el momento.

Lo que podría estar causando el cron job a fallar?

¿Fue útil?

Solución

Está usted seguro de que el archivo temporal que se crea correctamente cuando se ejecuta como una tarea en el cron?El directorio de trabajo para la secuencia de comandos será especificado en la CASA de la variable de entorno, o el /etc/passwd entrada para el usuario que instaló el cron job.Si implementar no tiene permisos de escritura para el directorio en el que se está ejecutando, entonces usted podría especificar una ruta absoluta del archivo de volcado para solucionar el problema.

Otros consejos

Cuando las secuencias de comandos se ejecutan correctamente de forma interactiva, pero no cuando se ejecute el cron, el problema suele ser debido al ambiente de la configuración del entorno en el lugar ...por ejemplo, la RUTA de acceso como el mencionado de alrady por @Ted Percival, pero pueden existir otras variables de entorno.

Esto es debido a que el cron no va a invocar .bash_profile, .bashrc o /etc/profile antes de la ejecución.

La mejor manera de evitar esto es para asegurar que las secuencias de comandos cron invoca no hacer ninguna suposición sobre el medio ambiente, cuando la ejecución.Superar esto puede ser tan simple como la inclusión de un par de líneas en el script para asegurarse de que el entorno está configurado correctamente.Por ejemplo, en mi caso tengo todos los ajustes significativos en /etc/profile (para red hat enterprise linux), así que voy a incluir la siguiente línea en cualquier ejecución de secuencias de comandos en virtud de cron:

source /etc/profile

Se parece a su PATH falta un par de directorios, lo que es más importante /bin (para /bin/rm).He aquí lo que mi sistema /etc/crontab usos:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Es cron envío de correos electrónicos con los registros?

Si no, el resultado de la canalización de cron en un archivo de registro.

Asegúrese de redirigir STDERR para el registro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top