質問: Railsで `rake foo` というタスクがあり、同一サーバー上に定期的にファイルを更新してる `/var/foo/data.yml`がある状態なのですが、この `data.yml`が更新された時に `rake foo`を走らせたく思っています。 方法としては * `data.yml`を生成するスクリプトの最後の`rake foo`を外部から呼び出す方法 * Railsで`data.yml`のファイルスタンプを常に見ておいて更新されたら`rake foo`を呼び出す方法 の2通りが思いついたのですが、外部からRails内部を触りに行くよりは、Railsが外部ファイルを触りに行くほうが自然な気がするのでRailsで特定のファイルの更新を監視する方法があれば知りたいです。 `data.yml`取得のスクリプト部分をRailsプロジェクト内に入れることも考えたのですが、下手に入れると複雑に絡み込んでしまいそうで全く別の物として使っています。 このような場合どうすれば`data.yml`の更新を検知してすぐにRakeタスクを走らせることができますか? Rakeタスクの管理には`Whenever`を使い、外部スクリプトの定期実行には別ユーザーでの`cron`を使っています。
回答: Whenever から1分ごとに適当なスクリプトを呼び出し、その中でファイルが変更されたことをチェックしてはいかがでしょうか? (もしくは、`rake foo` で呼び出される処理中で判定する。) ファイルの更新時刻やダイジェスト値などを保存しておき、現在のものと比較することで変更を検出できます。 1分ごとのチェックでは粗すぎるのであれば、`inotify` (Linuxの場合) などのツールを使って検知するのが良い思います。