Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Whenever 젬으로 Ruby에서 Cron 작업 손쉽게 예약하는 방법

Cron이란 무엇인가?

Cron은 Linux와 macOS 운영체제에서 기본적으로 제공되는 작업 스케줄링 시스템입니다.

지정한 시간에 어떤 프로그램이든 자동으로 실행할 수 있으며, 물론 Ruby 코드도 실행 가능합니다.

매일, 매주, 심지어 매시간 반복해서 자동으로 수행해야 하는 정기 작업이 있다면 Cron이 딱 맞는 도구입니다.

Cron으로 처리하기 좋은 작업의 예:

  • 매주 데이터베이스 백업 실행
  • 웹사이트 활동에 대한 일일 리포트 생성
  • 알림 이메일 발송

그럼 지금부터 Cron을 활용하는 방법을 알아보겠습니다!

Cron 기본 사용법

모든 사용자는 자신만의 cron 파일을 가질 수 있으며, 이 파일에 실행하고 싶은 작업을 정의합니다.

crontab -e 명령어로 이 파일을 편집할 수 있고,

crontab -l 명령어로 등록된 예약 작업 목록을 확인할 수 있습니다.

Cron 작업 예시:

0 0 * * * /opt/rubies/ruby-2.5.1/bin/rake db:backup

Cron 문법은 다소 생소하고 헷갈리기 쉽기 때문에, 이런 파일을 일일이 손으로 수정하고 싶지 않을 수 있습니다.

그렇다면 작업을 더 쉽게 관리해 주는 젬(gem)은 없을까요?

네, 있습니다!

Whenever 젬 사용 방법

Cron 문법은 외우기 어렵기 때문에 whenever 같은 젬을 활용하면 편리합니다.

이 젬을 사용하면 Ruby 코드로 cron 작업을 정의할 수 있습니다.

먼저 젬을 설치한 뒤,

설정 파일을 생성합니다:

wheneverize .
# [add] config/schedule.rb

생성된 파일을 열어보면 주석 처리된 예제들이 보입니다. 필요 없다면 삭제해도 됩니다.

예를 들어, 매시간 실행되는 백업 작업을 만들고 싶다면 다음과 같이 작성합니다.

"config/schedule.rb" 파일에 아래 내용을 추가하세요:

every 1.hour do
  rake "db:backup"
end

사용할 수 있는 옵션:

  • rake — 현재 프로젝트에 정의된 rake 태스크를 실행합니다. 참고로 db:backup은 기본 제공되지 않으므로, 테스트할 때는 db:version을 사용해 보세요.
  • runner — Ruby 클래스 + 메서드를 실행합니다. 예: Archive.backup_now
  • command — 시스템 명령어를 실행합니다.

이제 다음 명령어로 cron 항목을 생성합니다:

whenever --update-crontab

crontab -l로 새 항목이 잘 등록되었는지 확인할 수 있습니다.

실제 출력 결과 예시:

0 * * * * /bin/bash -l -c 'cd /home/jesus/testing && RAILS_ENV=production bundle exec rake db:backup --silent'

주목할 점은 이 작업이 production 모드에서 실행된다는 것입니다.

이 설정을 바꾸고 싶다면 어떻게 할까요?

다음 설정을 사용하면 됩니다:

set :environment, "development"

이 코드는 schedule.rb 파일의 최상단에 추가합니다.

또는 다음 명령어를 사용할 수도 있습니다:

whenever --update-crontab --set environment=development

이 명령어를 실행하면 모든 작업이 "development" 환경으로 생성됩니다.

Whenever 추가 활용 예제

다음 예제들은 좀 더 구체적인 스케줄을 지정하는 방법을 보여줍니다.

매주 월요일 오후 6시에 실행되는 작업:

every :monday, at: "6:00 PM" do
  runner "Mail.send_weekly_newsletter"
end

하루 중 여러 번 같은 작업을 실행하고 싶을 때는 다음처럼 작성합니다.

하루 두 번 실행되는 작업:

every :day, at: ["12:00 AM", "12:00 PM"] do
  command "rm tmp/testing.txt"
end

Whenever 젬의 로깅과 문제 해결

crontab 파일에 작업이 등록되었다면(crontab -l로 확인) 준비는 끝났습니다.

다음 단계는 무엇일까요?

예약된 작업이 제대로 동작하는지 어떻게 알 수 있을까요?

로깅을 설정하고 출력 내용을 확인하면 됩니다.

schedule.rb 파일 최상단에 아래 설정을 추가하면 로깅이 활성화됩니다.

설정 예시:

set :output, "log/cron.log"

설정을 변경할 때마다 반드시 whenever --update-crontab 명령어를 다시 실행해야 한다는 점을 잊지 마세요!

로그 파일이 비어 있다면?

예약된 실행 시간이 될 때까지 기다려야 로그가 기록됩니다.

참고로, 로그에서 다음과 같은 에러가 보인다면:

/bin/bash: bundle: command not found

Cron이 현재 사용 중인 Ruby 버전과 다른 버전으로 작업을 실행하고 있다는 의미입니다.

Ruby 버전 관리자(rbenv, RVM 등)를 사용 중이라면:

cron 작업에서도 해당 버전 관리자를 사용할 수 있도록, .bashrc가 아니라 .bash_profile 파일에서 이를 불러오도록 설정하세요.

Whenever의 대안들

Whenever는 꾸준히 유지보수되고 있는 훌륭한 젬이지만, 다른 선택지도 있습니다.

주요 대안 목록:

  • Heroku Scheduler — Heroku 사용자를 위한 무료 작업 스케줄링 애드온입니다. Cron만큼 유연하지 않지만 간단한 작업에는 충분히 실용적입니다.
  • Rufus Scheduler — Cron을 대체하는 인메모리(in-memory) 스케줄러 기반의 Ruby 젬입니다.
  • Sidecloq & Sidekiq-cron — 둘 다 Sidekiq에 반복 작업 기능을 추가해 주는 애드온입니다.

Sidekiq 애드온들은 스케줄 지정 시 실제 cron 문법을 요구하기 때문에 whenever 문법만큼 깔끔하지는 않습니다.

대신 Sidekiq 웹 UI와 연동된다는 장점이 있습니다.

마무리

이번 글에서는 whenever 젬을 사용해 Ruby에서 cron 작업을 예약하는 방법을 배웠습니다.

기본 문법부터 환경 설정, 로깅, 문제 해결, 그리고 대안까지 살펴보았으니, 이제 반복 작업을 자동화해 볼 차례입니다.

이 글이 도움이 되셨다면 주변에 공유해 주세요. 읽어주셔서 감사합니다!