簡體   English   中英

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

[英]Why Doesn't My Cron Job Work Properly?

我在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工作失敗?

當腳本以交互方式正確運行而不是由cron運行時,問題通常是因為環境環境設置到位...例如@Ted Percival提到的PATH作為alrady,但可能是其他環境變量。

這是因為cron在執行之前不會調用.bash_profile,.bashrc或/ etc / profile。

避免這種情況的最佳方法是確保cron調用的任何腳本在執行時不會對環境做出任何假設。 過度使用可以像在腳本中包含幾行一樣簡單,以確保正確設置環境。 例如,在我的情況下,我在/ etc / profile(對於RHEL)中有所有重要設置,因此我將在cron下運行的任何腳本中包含以下行:

source /etc/profile

看起來你的PATH缺少一些目錄,最重要的是/bin (對於/bin/rm )。 這是我的系統的/etc/crontab使用的:

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

在作為cron作業運行時,您確定正確創建了臨時文件嗎? 腳本的工作目錄將在HOME環境變量中指定,或者在安裝cron作業的用戶的/ etc / passwd條目中指定。 如果deploy對其正在執行的目錄沒有寫權限,則可以指定轉儲文件的絕對路徑來解決問題。

cron是否發送帶日志的電子郵件?

如果沒有,將cron的輸出傳遞給日志文件。

確保將STDERR重定向到日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM