ほんじゃらねっと

食と自転車とダイエットとたまにプログラミング

Windowsでタスクスケジューラを使用せずにnode.jsスクリプトを定期実行する

会社の自分のPC(Windows)で何かを定期的に実行したいときは

だいたいPythonなりnode.jsなりでスクリプトを書いて

タスクスケジューラに登録しておく。

のだけど、

タスクスケジューラは未ログイン時に実行しようとすると

ログインアカウントを登録しておく必要があったり、

パスワードを変更した時に更新を忘れて実行に失敗しまくってたり、

そのログイン失敗のせいで社内ネットワークから閉め出されちゃったり、

色々と困ることがある。

Linuxのcrondと同じような仕組みができないか、と探してみたら

「pm2」と「node-cron」の組み合わせで実現できそうだったので、試してみた。

参考情報

こちらの参考ページを読んだらこのあとの内容は読まなくても良いくらいなのだけど、

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

「node-cron」はその名の通りnode.jsでcron機能を実現するためのライブラリで、

www.npmjs.com

cron風の書式でスケジュールと関数を登録しておくと

指定したタイミングでその関数を実行してくれる。

これだけでもまあ十分なのだけど、PCの起動時に自動起動したいので、

「pm2」でプロセスを管理する仕組みにしておく。

pm2.keymetrics.io

サンプル

例えばRedmineの未完了チケットの情報を

定期的にDBに保存してあとで集計したいとして、

「import_tickets.js」というファイルに

asyncなexportされたmain関数でその処理を書いたとする。

こいつを定期実行する場合、下記のような手順となる。

まず、前準備として、pm2とnode-cronをnpm installしておく。

npm install --save node-cron
npm install -g pm2

あと、Windowsで自動起動させるためにpm2のプラグイン的なものを追加する。

npm install -g pm2-windows-startup

次にnode-cron用のJSファイルを作成する。

毎時0分0秒に実行したいとすると、下記のようなコードになる。

import_tickets_cron.js

const cron = require('node-cron');

const importTickets = require('./import_tickets');

cron.schedule('0 0 * * * *', async () => {
    await importTickets.main();
    console.log('job completed');
});

node-cronだけで動かす場合は下記のように起動すれば

ちゃんとプロセスが立ち上がって毎時実行してくれる。

node import_tickets_cron.js

次にこのスクリプトをpm2で管理できるようにする。

pm2 start import_tickets_cron.js

再起動しても設定が残るよう、プロセスリストを保存する。

pm2 save

最後に、PC起動時に自動起動するように登録する。

pm2-startup install

これでOK。

Windowsのログインアカウトを求められることもなく、

バックグラウンドで毎時間処理してくれる。

おわり

予想よりも簡単に定期処理が実現できた。

SSHトンネルを立ち上げておくとか、社内ポータルサイトをチェックするとか、

色々な自動化に応用できそう。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング