node.jsで定期的にスクリプトを実行するにはpm2が便利

定期的にスクリプトを実行するには定期的にタスクを実行させるnode-cronとプロセス管理ツールのpm2でスクリプトをデーモン化することによって実現できます。

例えば、毎日午前6時にgood morningを表示するだけのcron.jsを作成してみます。

インストール

まずはpm2とnode-cronをインストールします。

npm install pm2 -g 
npm install node-cron 

cron.jsを作成

定期的に実行するcron.jsを作成します。cronの詳しい表記はこのリンクが参考になります。

let cron = require('node-cron');
cron.schedule('0 0 6 * * *', () => {
  //定期的に実行する
  console.log('good morning');
});

scheduleの第一引数でスクリプトが実行される時刻を指定しています。左から秒、分、時、日、月、曜日となっています。アスタリスクは任意の時間を表しています。
第二引数のコールバックに処理内容を記述します。

pm2を使ってデーモン化

プロセスをデーモン化するのはとっても簡単です。

pm2 start cron.js

でデーモン化できます。また、プロセスを停止させるには

pm2 stop cron.js

を実行します。
logを表示させたい場合は

pm2 logs cron

を実行します。

[Postgresql] ローカルマシンから外部サーバー(Ubuntu)のDBに接続する

外部のIPアドレスからDBにアクセスできるようにするため、PostgreSQLサーバーの環境設定ファイルとなっている 外部サーバーのetc/postgresql/9.3/main/postgresql.confのlisten_address= …の箇所を

listen_addresses = '*'
に書き換えます。

次にPostgreSQL サーバーへの接続制限、認証方法に関する設定を行うための設定ファイルである、 /etc/postgresql/9.3/main/pg_hba.confに下記を追加します。

host all all ローカルマシンのIPアドレス/24 trust
自分のIPアドレスはwhat is my ipでGoogle検索をすると取得できます。

ちなみにすべてのホストからの外部DBへのアクセスを許可する場合は

host    all         all         0.0.0.0/0 md5
とします。

coを使って非同期処理を綺麗に書く

coを使うとJavaScriptの非同期処理を同期的に書くことができてかなり読みやすいコードが書けるようになります。

例えば、非同期にファイルの中身を取得するプログラムでもかなりすっきりとした感じになります。

'use strict';
let co = require('co');
let fs = require('fs');

let readFile = (path) => {
	return new Promise((resolve,reject) => {
		fs.readFile(path,(err,data) => {
			if (err) return reject(err);
			let jsonData = JSON.parse(data);
			return resolve(jsonData);
		})
	})
};


co(function *(){
	//success
	let read = readFile('./data.json');
	let data = yield read;
	//dataにdata.jsonの中身が入っている
	console.log(data)

}).catch((err) => {
	//error
	console.log(err);

});

node-scheduleで指定した時刻にタスクを実行する

Node.jsで指定した時刻にタスクを実行させるにはnode-scheduleというライブラリが便利です。 時刻の指定はCron方式、Date形式で指定できるのが気に入っていてとても柔軟に扱えます。

使い方

5分ごとにタスクを実行

 let schedule = require('node-schedule');

 let j = schedule.scheduleJob(' */5 * * * *', function(){
  //Do something

 });

3時間後にタスクを実行

  let schedule = require('node-schedule');

 //fireDate: タスクを実行する時刻
  let fireDate = new Date();
  fireDate.setSeconds(fireDate.getSeconds() + 60 * 60 * 3);


  schedule.scheduleJob(fireDate, () => {
   //Do something
  });