LoginSignup
22
20

More than 5 years have passed since last update.

node.jsでファイル監視して、変更があったらSFTPして、さらにその機能をデーモン化?する。

Last updated at Posted at 2016-02-11

やりたいこと

特定のファイルの変更を監視し、変更があれば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というのもあるようです。

22
20
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
22
20