質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1011閲覧

システムがUTC、プログラムがJSTでcronを月初の0時5分に動かす

lyzmfeqpxs54

総合スコア237

cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2023/08/01 07:53

実現したいこと

システムがUTC環境、RailsがJST環境でcronを月初に動かす。

前提

Aws(ubuntu) + Railsでシステムを構築しており、AwsはUTCで、RailsはJstで動いています。
すでにシステムがこの状態ある程度稼働してしまっており、システム上よくないとはわかっているのですが、「システムのタイムゾーンの変更は避けたい」と考えております。

RailsはWheneverを使ってcronを設定しております。

システムUTC、RailsがJSTの都合以下のように毎月1日の10時30分に動くように設定を行い

every :month, :on => '1th', :at => jst('10:30') do
command "cd /home/ubuntu/project_name/current;RAILS_ENV=production bundle exec rails runner scripts/monthry_cron.rb"
end

$ crontab -l
コマンドで確認すると
30 1 1 * * /bin/bash -l -c <以下省略

のように日本時間の9時間前で登録され、実際に設定した正しい時間(日本時間1日の10:30)にcronが動作します。

ここまでが前提であり、実際に設定したい時刻は「毎月1日の0時5分」と考えております。
シンプルにWheneverに記載すると以下のようになるのですが

every :month, :on => '1th', :at => jst('0:05') do
command "cd /home/ubuntu/project_name/current;RAILS_ENV=production bundle exec rails runner scripts/monthry_cron.rb"
end

このように書いた場合に実際に登録される値を
$ crontab -l
コマンドで確認すると
5 15 1 * * /bin/bash -l -c <以下省略

と登録され、このままだとJSTの2日の0時5分動くcronとなってしまいます。

この9時間ずれを保ったまま「毎月1日の0時5分」にcronを動作させる方法を知りたくこちらに質問させていただきました。

ご教示いただけますと幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/08/01 09:52

AWS の場合、crontab 表記で day of month に L(Last day of each month) が指定できるかもしれません。 every '5 15 L * *' do  … end
otn

2023/08/01 18:28

every :month, :on => '1th', :at => '1:30' でどうなりますか?
guest

回答2

0

UTC時刻の毎月末15:05Zにスクリプトを実行したい、で合ってますか。
28日~31日の15時5分に「UTCの翌日が〇月1日か」をチェックし該当したら実行する形と思います。

チェックはスクリプト内に書くか、crontabに書くかですが、
動くか試してませんがcrontabだとこんなイメージでしょうか。

crontab

15 15 28-31 * * [ $(date -d +1day +\%d) -eq 1 ] && script.sh

cronに書くときはdateコマンドの%文字にエスケープになるかと思います。

投稿2023/08/01 11:26

hqf00342

総合スコア394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

JSTの1日に起動されたときのみmonthry_cron.rbを実行するがそれ以外のときに何もせず終了するシェルスクリプトを書いて、それをcronで毎日起動すればいいのではないですか。

sh

1#!/bin/sh 2 3if [ `date --date=9hours +%d` = "01" ]; then 4 cd /home/ubuntu/project_name/current 5 RAILS_ENV=production bundle exec rails runner scripts/monthry_cron.rb 6fi

投稿2023/08/01 09:06

ikedas

総合スコア4443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問