我有一个计划工作上的一个Ubuntu哈VP,只有一半的工作和我不能工作了,为什么。该工作是红宝石的脚本中使用快照,后一个数据库使用的一个轨道应用程序,然后将压缩和上载到远程服务器使用蔽.

Gzip文件被创建和复制成功的,但它总是零字节。然而,如果我跑的时命令直接从命令行它完美的作品。

这是计划任务的工作:

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'

我已经检查和双重检查所有的路径以及他们是正确的。既 蔽.阳明海运 (蔽凭证)和 数据库。阳明海运 (MySQL证书)都拥有通过执行用户(署)与只读的权限,用户(chmod400).我使用的1.1.x版本的净ssh和净蔽.我知道他们是不是最新的,但他们是我熟悉的时刻。

可能是什么造成的cron工作失败?

有帮助吗?

解决方案

你确定该临时文件是在创建正常运行时,作为一个定时的工作?工作的目录你的脚本中将规定在家庭环境中变量或/etc/passwd entry为用户安装了该计划的工作。如果部署并没有写入权限的目录,它是执行,然后你可以指定一个绝对的道路转储的文件来解决这个问题。

其他提示

当脚本正常运行交互式方式而不是在运行时,该问题通常是因为环境设置的环境中在地方...例如道路作为alrady提到通过@Ted珀西瓦尔,但也可以是其他环境变量。

这是因为计划不会调用。bash_profile,.更改或/etc/profile之前执行。

最好的方式来避免这是为了确保任何脚本援引时不作任何假设有关的环境当执行。过来,这可以很简单,为包括几行你的脚本,以确保环境是安装适当的。例如,在我的情况下,我们的所有重要设置/etc/profile(对之),所以我将包括以下行在任何运行的脚本下cron:

source /etc/profile

看起来像你 PATH 是失踪几个目录,最重要的是 /bin (对 /bin/rm).这里就是我的系统 /etc/crontab 使用:

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

是cron发送电子邮件记录?

如果没有,管输出的cron日志的文件。

确保向STDERR的记录。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top