node.jsのいろいろなモジュール36 – Macでnodeアプリをネイティブプロセスとして管理する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

普通のnodeアプリとネイティブプロセスとしての管理の違い

通常、nodeアプリを起動した場合、アクティビティモニタで確認すると、次のようなプロセスが表示されます。
node-mac1

別にこれでも大きな問題にはならないのですが、通常のアプリ/サービスと同じように任意の名前で確認できれば便利な場合もあります。
今回紹介するnode-macというモジュールを使用すれば、次のようにnodeアプリに任意の名前をつけてサービス化することができます。
node-mac2

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Node.js : v0.10.4
  • npm : 1.2.18

npmを使用してnode-macモジュールをインストールしましょう。

% mkdir node-mac
% cd node-mac
% npm install node-mac

サンプルプログラム作成

まずはネイティブプロセス化して起動するnodeアプリを作成します。
次のようなシンプルなhttpサーバをapp.jsという名前で記述しましょう。

//app.js
var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World');
}).listen(3000, '127.0.0.1');

console.log('Server running at http://127.0.0.1:3000/');

そして、node-macを使用してnodeアプリをインストール/アンインストール/スタート/ストップするためのプログラムを記述します。
Serviceオブジェクトで任意の名前、サービス化したいnode.jsファイルのパスを記述します。
下記プログラムではコマンドライン引数によってインストール/アンインストール/スタート/ストップを切り替えるようにしています。

//node-mac.js
var Service = require('node-mac').Service;

//コマンドライン引数取得
var command = process.argv[2];

//サービスオブジェクト
var svc = new Service({
  name:'hello server',
  description:'Hello worldを返す簡易HTTPサーバ.',
  script: '/path/your/node-mac/app.js'
});

//インストール時の動作
svc.on('install',function(){
  console.log("install & start service.");
  svc.start();
});

//すでにサービスがインストールされていた時の動作
svc.on('alreadyinstalled',function(){
  console.log("service is already installed.");
});

//アンインストール時の動作
svc.on('uninstall',function(){
  console.log('Uninstall service.');
  console.log('The service exists: ',svc.exists);
});


if(command === "install") {
  svc.install();
} else if(command === "start") {
  svc.start();	
} else if(command === "stop") {
  svc.stop();	
} else if(command === "uninstall") {
  svc.uninstall();
} else {
  console.log("usage: sudo node node-mac.js [install | uninstall | start | stop]");
}

では、プログラムをインストールしてみましょう。installコマンドを実行すると、サービスがインストールされ、開始されます。

% sudo node node-mac.js install

アクティビティモニタで確認してみてください。「hello server」という名前のプロセスが起動しています。
また、/Library/Logs/以下にイベントログも出力されるようになります。
node-mac3

サービスの開始、停止はstartとstop、アンインストールする場合にはuninstallオプションを指定してnode-macを実行してください。

% sudo node node-mac.js uninstall //サービスのアンインストール

まとめ

今回はnodeアプリをMacのネイティブプロセスとして管理するアプリ、node-macを使ってみました。
ここにあるように、envオプションを使用すれば
サービスに任意の環境変数を渡すこともできます。

参考サイトなど