RailsアプリケーションがRakeから起動されたかどうかを知る方法(厳選2選)

Railsアプリケーションの起動の仕方

Railsアプリケーションは基本的にwebアプリケーションとしてunicorn等のアプリケーションサーバーから起動されるのが一般的です。

また、バッチ処理的なものもRailsのアプリケーションの一部として記載でき、モデル等を共有して処理を記述できるので非常に生産効率が高いです。

バッチ処理的なものはrakeタスクにして、Rakeから起動することも多いと思います。その場合、モデル等からunicornから起動されたのか、Rakeから起動されたのかを知りたい時等あるかもしれません。

そんな時に役立つかもしれない、RailsアプリケーションがRakeから起動されたかどうかを知る方法、厳選2選です。

1)実行コマンドを確認する

Rakeタスクとして起動する場合は、rakeコマンドから起動されます。それを確認します。

if $0.split("/").last == "rake"
  # Rakeタスクとして起動したときの処理
else
  # それ以外の処理
end

という感じですね。とても素直です。 rakeコマンドにシンボリックリンクを貼っていたらどうするかについて知りたい? インフラを構築した人に文句を言って直してもらいましょう。

2)環境変数にそれと分かる値を入れてRakeタスクを実行

元も子も無いですが、これが一番確実だと思います。cronで実行するならば、crontabに環境変数付けてrakeコマンドを登録して下さい。

BATCH=true bundle exec rake any:task

てな感じでRakeタスクを起動して、

if ENV["BATCH"] == "true"
  # Rakeタスクとして起動したときの処理
else
  # それ以外の処理
end

という感じで判定します。

結論

2種類方法を示しましたが、合わせるのが良いのでは無いか、というのが結論です。 実際にRakeタスクとそうでない時で処理を変えたいことがありました。その時は、

if ENV["BATCH"] == "true" || $0.split("/").last == "rake"
  # Rakeタスクとして起動したときの処理
else
  # それ以外の処理
end

てな感じにして、環境変数を付けて判別しつつ、Rakeコマンドから実行されたかどうかの判定を安全装置的に利用しました。

安全装置は場合によっては(テスト等で)不要になると思いますので、時と場合によって使い分けると良いかと思います。