Domanda

Ho un lavoro cron su un VPS Ubuntu Hardy che funziona solo a metà e non riesco a capire perché.Il lavoro è uno script Ruby che utilizza mysqldump per eseguire il backup di un database MySQL utilizzato da un'applicazione Rails, che viene quindi compresso con gzip e caricato su un server remoto utilizzando SFTP.

Il file gzip viene creato e copiato correttamente ma è sempre composto da zero byte.Tuttavia, se eseguo il comando cron direttamente dalla riga di comando, funziona perfettamente.

Questo è il lavoro cron:

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

Questo è 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'

Ho controllato e ricontrollato tutti i percorsi e sono corretti.Entrambi sftp.yml (credenziali SFTP) e database.yml (credenziali MySQL) sono di proprietà dell'utente che esegue (distribuzione) con autorizzazioni di sola lettura per quell'utente (chmod 400).Utilizzo le versioni 1.1.x di net-ssh e net-sftp.So che non sono gli ultimi, ma sono quelli con cui ho familiarità al momento.

Cosa potrebbe causare il fallimento del processo cron?

È stato utile?

Soluzione

Sei sicuro che il file temporaneo venga creato correttamente durante l'esecuzione come processo cron?La directory di lavoro per il tuo script verrà specificata nella variabile d'ambiente HOME o nella voce /etc/passwd per l'utente che ha installato il processo cron.Se deploy non dispone delle autorizzazioni di scrittura per la directory in cui è in esecuzione, è possibile specificare un percorso assoluto per il file dump per risolvere il problema.

Altri suggerimenti

Quando gli script vengono eseguiti correttamente in modo interattivo ma non quando vengono eseguiti da cron, il problema è solitamente dovuto alle impostazioni dell'ambiente in atto...ad esempio il PATH come già menzionato da @Ted Percival, ma potrebbero essere altre variabili di ambiente.

Questo perché cron non invocherà .bash_profile, .bashrc o /etc/profile prima dell'esecuzione.

Il modo migliore per evitarlo è garantire che tutti gli script richiamati da cron non facciano alcuna ipotesi sull'ambiente durante l'esecuzione.Superare questo problema può essere semplice come includere alcune righe nello script per assicurarsi che l'ambiente sia configurato correttamente.Ad esempio, nel mio caso ho tutte le impostazioni significative in /etc/profile (per RHEL), quindi includerò la seguente riga in tutti gli script da eseguire sotto cron:

source /etc/profile

Sembra il tuo PATH mancano alcune directory, cosa più importante /bin (per /bin/rm).Ecco qual è il mio sistema /etc/crontab utilizza:

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

Cron invia e-mail con i registri?

In caso contrario, reindirizzare l'output di cron a un file di registro.

Assicurati di reindirizzare STDERR al registro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top