예약된 cron 작업이 Rails에서 동시에 실행될 때마다 방지합니다.

Simply.TV에는 내부 프로세스 중 일부를 감시하기 위해 실행 중인 여러 cronjob이 있습니다.

이러한 작업은 whenever gemrunner 작업 유형을 사용하여 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_templatebash 기본값과 정확히 같은 whenever 명령을 사용하고 있지만 실제 작업 실행을 flock 명령으로 래핑했습니다. flock 임시 파일을 작성하고(작업을 파일 이름으로 사용) 이 임시 파일을 사용하여 작업이 이미 실행 중인지 추적합니다. 이미 실행 중인 경우 실행을 건너뛰고 종료됩니다.
동시에 job_type 기본값인 작은따옴표 대신 큰따옴표로 작업을 래핑하여 주자에 대한 whenever도 약간 변경합니다. 이는 job_template가 묶음 명령을 작은따옴표로 묶을 수 있도록 하기 위한 것입니다. 모든 것이 쉬워집니다.

이제 whenever 메서드를 통해 runner를 사용하여 작업을 예약할 때마다 작업은 flock를 통해 실행되어 동일한 작업이 두 번 실행되지 않도록 합니다.

좋은 웹페이지 즐겨찾기