Frage

Ich habe einen cron-job auf einem Ubuntu-Hardy VPS, die nur die Hälfte funktioniert und ich kann nicht herausfinden, warum.Der job ist ein Ruby-Skript, das verwendet mysqldump zu sichern einer MySQL-Datenbank verwendet, die durch eine Rails-Anwendung, die dann Gzip-und Upload auf einen remote-server mit SFTP.

Die gzip-Datei erstellt und erfolgreich kopiert, aber es ist immer null-bytes.Doch wenn ich den cron-Befehl direkt über die Befehlszeile funktioniert es perfekt.

Dies ist der cron-job:

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

Dies ist 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'

Ich habe überprüft und überprüft, alle Wege und Sie sind korrekt.Beide sftp.yml (SFTP-Anmeldeinformationen) an und Datenbank.yml (MySQL-Anmeldedaten) sind im Besitz der ausführende Benutzer (deploy) mit nur-lese-Berechtigungen für diesen Benutzer (chmod 400).Ich bin mit dem 1.1.x Versionen von net-ssh-und net-sftp.Ich weiß, Sie sind nicht die neuesten, aber Sie sind das, was ich bin vertraut mit in dem moment.

Was könnte die Ursache der cron-job zu scheitern?

War es hilfreich?

Lösung

Sind Sie sicher, dass die temporäre Datei wird ordnungsgemäß erstellt, wenn läuft als cron-job?Working directory für dein Skript wird entweder im HOME-Umgebungsvariable oder die Datei /etc/passwd für den Benutzer, installiert der cron-job.Wenn die Bereitstellung nicht über Schreibberechtigungen für das Verzeichnis, in dem es ausgeführt wird, dann könnten Sie einen absoluten Pfad für die dump-Datei zu lösen die problem.

Andere Tipps

Wenn die Skripts ordnungsgemäß ausgeführt interaktiv, aber nicht, wenn von cron ausgeführt, das problem ist in der Regel wegen die Umwelt zu Umwelt-Einstellungen ...beispielsweise kann der PFAD wie bereits erwähnt von @Ted Percival, sondern können auch andere Umgebungsvariablen.

Dies ist, weil cron nicht aufrufen .bash_profile, .bashrc oder /etc/profile, bevor Sie ausgeführt wird.

Der beste Weg, um dies zu vermeiden, ist sicherzustellen, dass alle Skripts aufgerufen, per cron machen keine Annahmen über die Umwelt bei der Ausführung.Over-coming dies kann so einfach wie ein paar Zeilen in Ihrem Skript zu machen sicher die Umwelt ist setup richtig.Zum Beispiel, in meinem Fall habe ich alle wichtigen Einstellungen in /etc/profile (für RHEL), so werde ich die folgende Zeile in jedem ausführen von Skripts unter cron:

source /etc/profile

Sieht aus wie Ihre PATH fehlen ein paar Verzeichnisse, am wichtigsten /bin (für /bin/rm).Hier ist, was mein system ist /etc/crontab verwendet:

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

Ist cron versenden von E-Mails mit Protokollen?

Wenn nicht, leiten Sie die Ausgabe von cron in einer log-Datei.

Stellen Sie sicher, dass die Umleitung STDERR zu Protokoll.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top