始めに
背景
Webアプリケーションを組んでいると、外部システムと連携して処理を行う、なんてことは良くあると思います
例えば
- 専用のロガーが温度等を常に計っていて、それを定期的にFTPでWebシステムにアップロード
- FTPでアップロードされたデータをWebアプリケーションとして見易く表示
なんて要件があったりします
FTPで回収したデータを即座にWebアプリケーションへ取り込む方法のお話です
使ったもの
- Ruby on Rails
- Rake(Rails同梱)
- vsftpd
- inotify ※今回の主役
下ごしらえ
下ごしらえ
- Railsアプリを作成します
- FTPで連携されるファイル読んでDBに反映するrakeタスクを作ります
- 手動でrakeタスクを実行して動くことを確認します
- FTPサーバーを立てます
FTPとの連携
FTPとの連携
- FTPによってアップロードされたファイルを保存するディレクトリを決めます
- そのディレクトリをinotifyで監視するスクリプトを書きます
- 監視して、ファイルが保存されたら先程の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
- 監視するイベントを定義
-
CREATE
やMODIFY
にするとファイルを書込始めた時に発火するので注意 -
ACCESS
を使ってアクセス数カウントしたり
ちょっとした解説
| while read line; do
# ...
done
-
inotify
は標準出力にイベントと対象のファイルを書き出すのでそれをループで受け取る - 受け取ったものを
awk
等で適当に処理してあとはお好きに