web-dev-qa-db-ja.com

ruby

ディレクトリにドロップされた受信ファイルを処理する必要があるアプリケーションがあります。私はこれを行うための最良の方法を探しています。

私たちはループするBackgroundrbプロセスを使用してきましたが、正直なところ、Backgroundrbは信頼性が低く、可能であればそれから離れたいと考えています。

Delayed_jobは、進行中のタスク用ではなく、1回限りのもののようです。

DirectoryWatcher http://codeforpeople.rubyforge.org/directory_watcher/ を見つけました。これは有望に見えますが、理想的には、これをある程度制御し、稼働しているかどうかを監視できるようにする必要があります。 。

したがって、要件は次のとおりです。

  • 永遠に走る
  • ファイルを順番に処理する
  • 監視可能であること
  • それを再起動し、それが稼働していることを確認する何らかの方法があります(神?)

ご入力いただきありがとうございます。これは難しいことではないはずです。ビジネスアプリケーションではこれは珍しいことではないと思っていたので、Web上で他の誰かがこれについて話しているのを見つけることができないことに驚いています。

27
phil

そして、 guard :もあります。

Guardは、ファイルまたはディレクトリが変更されるたびにカスタムルールを実行することにより、さまざまなタスクを自動化します。

これは、ソフトウェア開発者、Webデザイナー、ライター、その他の専門家によって、ソースファイルや構成を変更した後のツールの「再起動」などのありふれた反復的なアクションやコマンドを回避するために頻繁に使用されます。

一般的な使用例は次のとおりです。IDE交換、Web開発ツール、「スマート」および「レスポンシブ」ビルドシステム/ワークフローの設計、さまざまなプロジェクトタスクの自動化、さまざまなシステムサービスのインストール/監視...

11
Bill Turner

ありがとう @ emerge 、Railsの相対的な初心者として、コマンドからではなく、Railsアプリでファイルを監視したかったここにある他のオプションと比較すると、 Listen は非常に単純な2つのステップであることがわかりました。

  1. これをgemファイルに追加しました:

    gem 'listen', '~> 2.0'
    
  2. 次に、これをApplication.rbに追加して、アプリの起動時に実行します。

    listener = Listen.to('public/json_import') do |added| 
      puts "added absolute path: #{added}"
    end
    listener.start # not blocking
    

複数のdirを聞いたり、変更/追加/削除したりすることもできます。

listener = Listen.to('dir/to/listen', 'dir/to/listen2') do |modified, added, removed|
13
msanjay

小さなfilewatcherrubygemもあります。 gemには依存関係がなく、プラットフォーム固有のコードが含まれておらず、ポーリングによって更新、削除、追加を検出するだけです。

require 'filewatcher'

FileWatcher.new(["directory"]).watch() do |filename, event|
  if(event == :changed)
    puts "File updated: " + filename
  end
  if(event == :delete)
    puts "File deleted: " + filename
  end
  if(event == :new)
    puts "Added file: " + filename
  end
end
9
thomasfl

私が知っている3つの昔ながらのオプション:

Ara T. HowardのDirWatch:

私自身のDirectoryWatcher:

Paul HormanのFileSystemWatcher:

3
Phrogz

https://github.com/nex3/rb-inotify でうまくいくと思います。この宝石の使用例

require 'rb-inotify'
notifier = INotify::Notifier.new
notifier.watch("/tmp", :moved_to, :create) do |event|
    puts "#{event.absolute_name} is now in path /tmp!"
end
notifier.run
1
androidyue

https://github.com/mynyml/watchr

これは通常、単体テストを自動的に実行するために使用されますが、ニーズにも合うはずです。

1
noodl