コンテンツにスキップ

pm2でcronジョブを作成する

macOSで定期実行系の処理を行いたいが、相変わらずlaunchdの設定は分かりづらく、楽をしたかったので、pm2を使うことにした。

  • pm2のグローバルインストール(詳細は割愛)
  • pm2の永続化設定(詳細は割愛)
  • 実行するジョブの実装
  • pm2によるCronジョブの作成

pm2でcronジョブとして動かすための設定

Section titled “pm2でcronジョブとして動かすための設定”
Terminal window
cd $PROJECT_ROOT
pm2 ecosystem
ecosystem.config.cjs
module.exports = {
apps: [
{
name: "cronJob",
script: "main.ts",
interpreter: "~/.bun/bin/bun",
// インスタンス数は1
instances: 1,
// 15分ごとに起動
cron_restart: '*/15 * * * *',
exec_mode: "fork",
// 対象ファイルが更新されたときに自動再起動するか: しない
watch: false,
// 自動再起動するか: しない
autorestart: false
},
],
};
Terminal window
pm2 start ecosystem.config.cjs
pm2 save

IPアドレスを定期的に取得してDBに格納する処理

sample-job-with-bun.ts
import { Database } from 'bun:sqlite';
const DDL = `CREATE TABLE IF NOT EXISTS ip_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ip TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);`
async function fetchIpConfig() {
const response = await fetch("https://ifconfig.io/ip").catch((err) => new Error(err));
if (response instanceof Error || !response.ok) {
return null;
}
const ip = await response.text();
return ip;
}
async function main() {
const ip = await fetchIpConfig();
if (ip == null) return;
using db = new Database('ip-monitor.sqlite', { create: true });
db.exec(DDL);
using query = db.query("INSERT INTO ip_history (ip) VALUES ($ip);");
query.run({ $ip: ip });
}
await main();