pm2でcronジョブを作成する
macOSで定期実行系の処理を行いたいが、相変わらずlaunchdの設定は分かりづらく、楽をしたかったので、pm2を使うことにした。
実施したこと
Section titled “実施したこと”- pm2のグローバルインストール(詳細は割愛)
- pm2の永続化設定(詳細は割愛)
- 実行するジョブの実装
- pm2によるCronジョブの作成
pm2でcronジョブとして動かすための設定
Section titled “pm2でcronジョブとして動かすための設定”cd $PROJECT_ROOT
pm2 ecosystem
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 }, ],};
pm2 start ecosystem.config.cjs
pm2 save
実行ジョブのサンプル実装
Section titled “実行ジョブのサンプル実装”IPアドレスを定期的に取得してDBに格納する処理
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();