Почему моя работа Cron не работает должным образом?

У меня есть работа cron на Ubuntu Hardy VPS, которая работает только наполовину, и я не могу понять, почему. Задание представляет собой скрипт Ruby, который использует mysqldump для резервного копирования базы данных MySQL, используемой приложением Rails, которое затем распаковывается и выгружается на удаленный сервер с использованием SFTP.

Файл gzip успешно создан и скопирован, но это всегда ноль байтов. Тем не менее, если я запускаю команду cron прямо из командной строки, она работает отлично.

Это работа cron:

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

Это 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'

Я проверил и перепроверил все пути, и они верны. И sftp.yml (учетные данные SFTP), и database.yml (учетные данные MySQL) принадлежат исполняющему пользователю (deploy) с правами только для чтения для этого пользователя (chmod 400). Я использую 1.1.x версии net-ssh и net-sftp. Я знаю, что они не самые последние, но с ними я знаком на данный момент.

Что может вызвать сбой работы cron?

16.08.2008 16:15:18
4 ОТВЕТА
РЕШЕНИЕ

Вы уверены, что временный файл создается правильно при запуске как задание cron? Рабочий каталог для вашего скрипта будет указан либо в переменной среды HOME, либо в записи / etc / passwd для пользователя, установившего задание cron. Если у развертывания нет разрешений на запись для каталога, в котором он выполняется, вы можете указать абсолютный путь к файлу дампа, чтобы устранить проблему.

2
16.08.2008 16:34:37

Похоже, что вам PATHне хватает нескольких каталогов, самое главное /bin(для /bin/rm). Вот что использует моя система /etc/crontab:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
4
16.08.2008 16:50:15

Cron отправляет электронные письма с журналами?

Если нет, направьте вывод cron в файл журнала.

Обязательно перенаправьте STDERR в журнал.

0
19.08.2008 16:56:04

Когда сценарии выполняются правильно в интерактивном режиме, а не при выполнении cron, проблема обычно заключается в установленных настройках среды окружения ... например, PATH, как указано в @Ted Percival, но могут быть и другие переменные среды.

Это потому, что cron не будет вызывать .bash_profile, .bashrc или / etc / profile перед выполнением.

Лучший способ избежать этого - убедиться, что любые скрипты, вызываемые cron, не делают никаких предположений об окружающей среде при выполнении. Преодолеть это можно так же просто, как включить несколько строк в ваш скрипт, чтобы убедиться, что среда настроена правильно. Например, в моем случае у меня есть все важные настройки в / etc / profile (для RHEL), поэтому я включу следующую строку в любые скрипты, которые будут запускаться под cron:

source /etc/profile
9
18.10.2008 03:42:10