7

私はUbuntuHardyVPSでcronジョブを実行していますが、半分しか機能しませんが、その理由を理解できません。このジョブは、mysqldumpを使用してRailsアプリケーションで使用されるMySQLデータベースをバックアップするRubyスクリプトです。このデータベースは、Gzip圧縮され、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)を持っています。私はnet-sshとnet-sftpの1.1.xバージョンを使用しています。それらは最新のものではないことは知っていますが、現時点では私がよく知っているものです。

cronジョブが失敗する原因は何ですか?

4

4 に答える 4

9

スクリプトが対話的に正しく実行され、cron で実行された場合ではなく、通常、問題は環境環境設定が原因です。

これは、cron が実行前に .bash_profile、.bashrc、または /etc/profile を呼び出さないためです。

これを回避する最善の方法は、cron によって呼び出されるスクリプトが実行時に環境に関する仮定を行わないようにすることです。これを克服するには、環境が適切にセットアップされていることを確認するために、スクリプトに数行を含めるのと同じくらい簡単です。たとえば、私の場合、重要な設定はすべて /etc/profile (RHEL 用) にあるので、cron で実行するスクリプトに次の行を含めます。

source /etc/profile
于 2008-10-18T03:42:10.793 に答える
4

いくつかのディレクトリが欠落しているようPATHですが、最も重要なのは/bin(for /bin/rm)です。これが私のシステムの/etc/crontab用途です:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
于 2008-08-16T16:50:15.687 に答える
2

cronジョブとして実行しているときに、一時ファイルが正しく作成されていることを確認しますか?スクリプトの作業ディレクトリは、HOME環境変数で指定するか、cronジョブをインストールしたユーザーの/ etc/passwdエントリで指定します。deployに、それが実行されているディレクトリに対する書き込み権限がない場合は、ダンプファイルの絶対パスを指定して、問題を修正できます。

于 2008-08-16T16:34:37.357 に答える
0

cron はログ付きのメールを送信していますか?

そうでない場合は、cron の出力をログ ファイルにパイプします。

STDERR をログにリダイレクトしてください。

于 2008-08-19T16:56:04.113 に答える