やりたいこと
特定のファイルの変更を監視し、変更があればSFTPで他のサーバにアップロードしたい。
別にscpでもいいのですが、ある案件の要望がSFTPなので、SFTPで試します。
方針
PHPとかでもinotify を利用すると目的の機能を実装できるようでしたが、linuxカーネルのバージョンに依存したり、WindowsやMacでは少しやり方を変える必要があったりするようなので、プラットフォーム依存を無くすためにここではnode.jsを利用することにしました。
なお、node.jsの場合は、基本的に実行するconsoleを閉じるとプロセスも終了してしまうので、consoleを閉じたり、ログアウトしても継続的に実行されるようにデーモン化?します。
必要なツールのインストール
今回は、下記のツール、パッケージ等を利用しました。
- node 4.3.0(npm 2.14,12)
- chokidar(ファイルの状態監視)
- ssh2(SFTP clientとして利用)
- fs(ファイルシステムの利用)
- forever(デーモン化)
インストール
node.js本体のインストールはこちらをご覧下さい。
その他のツールは、以下の通りです。
npm install --save chokidar npm install ssh2 npm install fs npm install -g forever
実装
下記の様にしました。基本的には、ファイルの状態監視機能と、その中で呼び出すSFTP機能の実装に大きく別れます。
個別にメモした記事が下記になります(参考まで)。
いろいろ書いていますが、そんなに難しくはありません。
ファイル名はwatch.jsとしました。
//require var chokidar = require("chokidar"); //chokidarの初期化 var watcher = chokidar.watch('./data/',{ ignored:/[\/\\]\./, persistent:true }); //イベント定義 watcher.on('ready',function(){ //ready console.log("ready watching..."); //ファイルの追加 watcher.on('add',function(path){ console.log(path + " added."); }); //ファイルの編集 watcher.on('change',function(path){ console.log(path + " changed."); //upload uploadFile(); //下で実装 }); }); /* uploadFileの実装 ======================================================= */ //Function upload by sftp var uploadFile = function(){ var Client = require('ssh2').Client; var conn = new Client(); conn.on('ready',function(){ //ready console.log("ready sftp..."); //sftp conn.sftp(function(err,sftp){ //throw if error if(err) throw err; //file path var local = "./data/test.txt"; var remote = "./test_up.txt"; //upload sftp.fastPut(local,remote,{},function(err){ if(err){ console.log("upload error."); }else{ console.log("uploaded."); } }); }); //connection }).connect({ host: 'servername', port:22, username:'hoge', privateKey:require('fs').readFileSync('/Users/hoge/.ssh/id_rsa'), passphrase:'hoge' }); }
スクリプができたら、デーモン化する前に動作を確認しておきましょう。
node watch.js
とし、指定したフォルダ内のファイルを変更してみます(ここではdata/test.txt)。
アップロードが確認出来たら、デーモン化してみます。
デーモン化する
デーモン化するためにはforeverライブラリを使えばよいようです。
インストールがまだならインストールします。任意の場所で利用するので-gをつけておきます。
npm install -g forever
foreverのインストールができたなら、スクリプトを登録します。
forever start watch.js
実際に登録されたかは、
forever list
で確認出来ます。
デーモン化を止めたい場合は、
forever stop watch.js
とします。その他、restartというのもあるようです。