我在 Ubuntu Hardy VPS 上有一个 cron 工作,只有一半工作,我不知道为什么。该作业是一个 Ruby 脚本,它使用 mysqldump 备份 Rails 应用程序使用的 MySQL 数据库,然后将其压缩并使用 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 凭证)都归执行用户(部署)所有,对该用户具有只读权限(chmod 400)。我正在使用 1.1.x 版本的 net-ssh 和 net-sftp。我知道它们不是最新的,但它们是我目前熟悉的。
什么可能导致 cron 作业失败?