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

やりたいこと

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值