当前位置:  开发笔记 > 后端 > 正文

为什么我的Cron工作不能正常工作?

如何解决《为什么我的Cron工作不能正常工作?》经验,为你挑选了1个好方法。

我在Ubuntu Hardy VPS上有一个cron工作,只有一半工作,我无法解决原因.这个工作是一个Ruby脚本,它使用mysqldump来备份Rails应用程序使用的MySQL数据库,然后使用SFTP对其进行gzip压缩并上传到远程服务器.

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)只读权限拥有.我正在使用net-ssh和net-sftp的1.1.x版本.我知道它们不是最新的,但它们是我现在所熟悉的.

什么可能导致cron工作失败?



1> tardate..:

当脚本以交互方式正确运行而不是由cron运行时,问题通常是因为环境环境设置到位...例如@Ted Percival提到的PATH作为alrady,但可能是其他环境变量.

这是因为cron在执行之前不会调用.bash_profile,.bashrc或/ etc/profile.

避免这种情况的最佳方法是确保cron调用的任何脚本在执行时不会对环境做出任何假设.过度使用可以像在脚本中包含几行一样简单,以确保正确设置环境.例如,在我的情况下,我在/ etc/profile(对于RHEL)中有所有重要设置,因此我将在cron下运行的任何脚本中包含以下行:

source /etc/profile

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有