LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

FTPでファイルがアップロードされたらRailsで即座に処理する

Last updated at Posted at 2017-02-15
1 / 16

始めに


背景

Webアプリケーションを組んでいると、外部システムと連携して処理を行う、なんてことは良くあると思います


例えば

  • 専用のロガーが温度等を常に計っていて、それを定期的にFTPでWebシステムにアップロード
  • FTPでアップロードされたデータをWebアプリケーションとして見易く表示

なんて要件があったりします


FTPで回収したデータを即座にWebアプリケーションへ取り込む方法のお話です

使ったもの

  • Ruby on Rails
  • Rake(Rails同梱)
  • vsftpd
  • inotify ※今回の主役

下ごしらえ


下ごしらえ

  1. Railsアプリを作成します
  2. FTPで連携されるファイル読んでDBに反映するrakeタスクを作ります
  3. 手動でrakeタスクを実行して動くことを確認します
  4. FTPサーバーを立てます

FTPとの連携


FTPとの連携

  1. FTPによってアップロードされたファイルを保存するディレクトリを決めます
  2. そのディレクトリをinotifyで監視するスクリプトを書きます
  3. 監視して、ファイルが保存されたら先程のrakeタスクを起動します

出来上がったものがこちら


監視スクリプト

#/bin/bash
NOTIFYPATH=/home/appuser/ftp_docs/csvs
/usr/bin/inotifywait -e CLOSE_WRITE \
  -mrq $NOTIFYPATH | while read line; do
  path=`echo $line | /usr/bin/awk '{print $3}'`
  cp /home/appuser/ftp_docs/csvs/$path /usr/local/rails_apps/renkeiapp/current/data/
  chown deploy /usr/local/rails_apps/renkeiapp/current/data/$path
  chmod 755 /usr/local/rails_apps/renkeiapp/current/data/$path
  su - -c "cd /usr/local/rails_apps/renkeiapp/current;RAILS_ENV=production rake csv:import[$path]" deploy
done

これをrootユーザーで動かしておく

nohup /root/scripts/watch-ftp-directory.sh &
root@appserver:~# ps aux | grep -v grep | grep watch-ftp
root     25708  0.0  0.0   4508   928 ?        S    Jan21   0:00 /bin/sh /root/scripts/watch-ftp-directory.sh

ちょっとした解説


ちょっとした解説

-e CLOSE_WRITE
  • 監視するイベントを定義
  • CREATEMODIFYにするとファイルを書込始めた時に発火するので注意
  • ACCESSを使ってアクセス数カウントしたり

ちょっとした解説

| while read line; do
# ...
done
  • inotifyは標準出力にイベントと対象のファイルを書き出すのでそれをループで受け取る
  • 受け取ったものをawk等で適当に処理してあとはお好きに
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up