예약된 cron 작업이 Rails에서 동시에 실행될 때마다 방지합니다.
이러한 작업은 whenever gem 및
runner
작업 유형을 사용하여 1분마다 실행되도록 예약됩니다.1분마다 실행되도록 예약된 작업이 있습니다.
every 1.minute do
runner 'Parse.detect_crashed_jobs'
end
rails runner
명령을 사용하여 메서드Parse.detect_crashed_jobs
를 실행하고 매분 수행하고 있습니다.불행하게도 여러 가지 이유로 서버에서 로드가 증가하는 경우가 있으며 이러한 작업 중 하나가 결국 1분 이상 실행될 가능성이 있습니다. 이로 인해 crontab이 매분 작업을 계속 처리하므로 동일한 작업이 동시에 실행되도록 예약될 수 있습니다.
flock
를 입력합니다. flock
는 대부분의 Linux 배포판과 함께 제공되며 적어도 Linux Ubuntu 16.4 이상에서 테스트되었습니다.whenever
config/schedule.rb
파일에 새로운 작업 유형과 템플릿을 도입했습니다.job_type :runner, "cd :path && bin/rails runner -e :environment \":task\" :output"
set :job_template, "bash -l -c 'flock -n '\\''/tmp/:task-runner.lockfile'\\'' -c '\\'':job'\\'''"
job_template
는 bash
기본값과 정확히 같은 whenever
명령을 사용하고 있지만 실제 작업 실행을 flock
명령으로 래핑했습니다. flock
임시 파일을 작성하고(작업을 파일 이름으로 사용) 이 임시 파일을 사용하여 작업이 이미 실행 중인지 추적합니다. 이미 실행 중인 경우 실행을 건너뛰고 종료됩니다.동시에
job_type
기본값인 작은따옴표 대신 큰따옴표로 작업을 래핑하여 주자에 대한 whenever
도 약간 변경합니다. 이는 job_template
가 묶음 명령을 작은따옴표로 묶을 수 있도록 하기 위한 것입니다. 모든 것이 쉬워집니다.이제
whenever
메서드를 통해 runner
를 사용하여 작업을 예약할 때마다 작업은 flock
를 통해 실행되어 동일한 작업이 두 번 실행되지 않도록 합니다.
Reference
이 문제에 관하여(예약된 cron 작업이 Rails에서 동시에 실행될 때마다 방지합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mtrolle/prevent-whenever-scheduled-cron-jobs-to-run-simultaneously-in-rails-49cj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)