はじめに
個人開発の自動化基盤として、クラウドのJobスケジューラを使わずにWindowsタスクスケジューラで定期処理を回している。コストゼロで始められる点が魅力だが、実際に運用してみると地味にはまる設定がいくつかあった。本記事ではNode.jsスクリプトを定期実行する場合の具体的な設定ポイントをまとめる。
1. プログラムとして node.exe のフルパスを指定する
タスクスケジューラのアクション設定で「プログラム/スクリプト」欄に node とだけ書くと、PATHが通っていないために実行できないことがある。実行ユーザーのPATH設定がインタラクティブセッションと異なる場合があるため、C:\Program Files\nodejs\node.exe のようにフルパスで指定する方が確実だ。「引数の追加」欄にスクリプトのフルパス(例: C:\Users\user\projects\my-script.mjs)を書く。
ESModuleを使っている場合(.mjs拡張子やtype:moduleのpackage.json)は node --experimental-vm-modules 等のオプションが必要になることもあるが、Node.js 22以降では多くの場合そのままで動く。
2. 「開始(オプション)」にプロジェクトディレクトリを指定する
タスクスケジューラのアクション設定には「開始(オプション)」という欄がある。ここにスクリプトのディレクトリを指定しないと、実行時のカレントディレクトリが C:\Windows\system32 等になってしまい、スクリプト内で相対パスを使っているとファイルが見つからないエラーになる。
対策は2つある。ひとつは「開始(オプション)」にプロジェクトのディレクトリをフルパスで指定すること。もうひとつはスクリプト側で process.chdir() やESModuleの import.meta.url を使ってスクリプト自身の位置を基準にパスを組み立てること。後者の方がスクリプトの可搬性が高くなる。
3. PCのスリープ設定との干渉を確認する
定期実行タスクが予定した時刻にPCがスリープ状態だと実行されないことがある。タスクスケジューラの「条件」タブに「タスクを実行するためにスリープを解除する」という設定があり、これを有効にすることで実行時刻にスリープを解除できる。ただしスリープ解除には電源設定側での許可も必要で、「電源オプション」→「スリープ」→「スリープ解除タイマーの許可」が有効になっている必要がある。
深夜に実行する定期処理の場合は、この設定を見落とすと「設定したはずなのに実行されていない」という状況になりやすいため、初回セットアップ時に合わせて確認しておく。
4. ログ出力を標準出力ではなくファイルに落とす
タスクスケジューラで実行されたスクリプトの標準出力は、デフォルトでは確認できない。スクリプト側でファイルにログを書き出すか、実行コマンドをバッチファイル(.cmd)経由にしてリダイレクトする方法がある。
バッチファイル経由の場合はこのような構成になる:
@echo off
"C:\Program Files\nodejs\node.exe" "C:\projects\my-script.mjs" >> "C:\projects\logs\output.log" 2>&1
ログが残っていると、後から「なぜ実行されなかったか」「エラーが何だったか」を確認できる。自動化を長期運用するなら、ログの仕組みを最初から組み込んでおくことを強く勧める。
まとめ
Windowsタスクスケジューラはクラウド不要・追加コストなしで始められる手軽な自動化基盤だが、上記のような地味な設定ポイントを見落とすと「動いているはずなのに動いていない」という状況になりやすい。初回セットアップ時にこの4点を確認しておくと、後からの原因調査コストを大幅に削減できる。