背景
cron使ったら時間間隔やコマンドを書いておくと定期実行をやってくれるが、深夜は実行頻度下げてそれ以外の時間はいつも通りにしたいが、cronに書くやり方だけだと分からなかった。
あるかもしれないが、今後自由にカスタマイズできたほうが便利だと思うので作ってみることになった。
そういうGUIアプリあるが、自分用に便利なツールを作る
やり方
ざっくりいうと、Node.jsプログラムでcronファイルを作成する。
実行内容、実行間隔などを変数にして、cronファイルとして書き込んでしまえばいい。
cronファイルにcronファイルを作成するnode.jsプログラムを1分ごとに実行するコマンドを仕込んでおく。
プログラム
以下のようなコマンドのリストとなる配列を作成する。
「createExecTime」メソッドで、自由に定期実行間隔を作成しちゃえばいい。例えば実行するたびに時間を見て、深夜だったら定期実行時間を下げる数値をreturnしたらいい
あとは、上書きではなく追記である必要があるので「append」で書き込む。
※fsモジュールのappendをPromise使ったバージョンとかにしたメソッド作って呼び出す
const crontabCmdList = [
"# 何かコメント",
`*/${await createExecTime("機能名")} * * * * コマンド`,
// ・・・(以下省略)
]
for (let i = 0; i < crontabCmdList.length; i++) {
// 自作のファイル上書きメソッド
await appendPromise(cronTabFilePath, crontabCmdList[i] + "\n")
}
すると、きれいにcronファイルが作成できた。
今は1つのファイルにしているので、扱いやすくしたいならコマンド一覧をjsonにして外部ファイルにするのもありだと思う。
あと、createExecTime()メソッドに機能名のような引数を追加したら、機能ごとの時間が取得できるようになる。
機能ごとの時間とか、業務での開発だったら設定ファイルとかでまとめたほうが適切だとは思うが個人開発なので僕は直接配列にぶっこんでます。
世の中にあるGUIアプリによる定期実行もあるが、自分用のプログラムのほうがなんでも自由にカスタマイズできるので作ってよかった。