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

it2022-05-09  38

やりたいこと

特定のファイルの変更を監視し、変更があれば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機能の実装に大きく別れます。

個別にメモした記事が下記になります(参考まで)。

node.jsでファイル変更監視node.jsで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というのもあるようです。


最新回复(0)