문제

Ubuntu Hardy VPS에서 절반만 작동하는 cron 작업이 있는데 그 이유를 알 수 없습니다.작업은 mysqldump를 사용하여 Rails 애플리케이션에서 사용하는 MySQL 데이터베이스를 백업한 다음 SFTP를 사용하여 gzip으로 압축하고 원격 서버에 업로드하는 Ruby 스크립트입니다.

gzip 파일이 성공적으로 생성되고 복사되지만 항상 0바이트입니다.그러나 명령줄에서 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 자격 증명) 및 데이터베이스.yml (MySQL 자격 증명)은 해당 사용자(chmod 400)에 대한 읽기 전용 권한을 가진 실행 사용자(배포)가 소유합니다.저는 net-ssh와 net-sftp의 1.1.x 버전을 사용하고 있습니다.나는 그것이 최신이 아니라는 것을 알고 있지만 현재로서는 내가 잘 알고 있는 것입니다.

크론 작업이 실패하는 원인은 무엇입니까?

도움이 되었습니까?

해결책

cron 작업으로 실행할 때 임시 파일이 올바르게 생성되고 있습니까?스크립트의 작업 디렉터리는 HOME 환경 변수에 지정되거나 cron 작업을 설치한 사용자의 /etc/passwd 항목에 지정됩니다.배포가 실행 중인 디렉터리에 대한 쓰기 권한이 없는 경우 덤프 파일의 절대 경로를 지정하여 문제를 해결할 수 있습니다.

다른 팁

스크립트가 대화식으로 올바르게 실행되지만 cron으로 실행될 때는 실행되지 않는 경우 일반적으로 환경 설정이 적절하기 때문에 문제가 발생합니다.예를 들어 @Ted Percival이 언급한 PATH는 이미 언급되었지만 다른 환경 변수일 수도 있습니다.

이는 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이 로그와 함께 이메일을 보내나요?

그렇지 않은 경우 cron의 출력을 로그 파일로 파이프하십시오.

STDERR을 로그로 리디렉션해야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top