自動化は「手順を書き出す」ことから始まる
毎朝やっている作業を自動化したいと思ったとき、いきなりcrontabを開いて時刻を書き込む人は多いと思います。けれども、先に考えるべきなのはスケジュールではなく、その作業そのものです。何を入力として受け取り、何を出力し、どうなれば成功と言えるのか。ここが曖昧なままcronに載せると、動いているのかどうかさえ分からない仕組みができあがります。
この記事では、cronの細かい書式の解説ではなく、毎朝の作業を任せるときの考え方に絞って整理します。書式はmanページで確認できますが、設計の勘所は自分で決めるしかないからです。
方針1:まず手動で動くスクリプトにする
cronは、決めた時刻にコマンドを実行するだけの仕組みです。賢い判断はしてくれません。だから作業の中身は、cronとは独立したシェルスクリプトとして先に完成させておきます。
- ターミナルから手で実行して、期待どおりに終わることを確認する
- 引数や環境変数で変えたい部分を外に出しておく
- 成功時は終了コード0、失敗時は0以外を返すようにする
手で動かせないものは、cronからも動きません。切り分けのしやすさという意味でも、この順番は大切です。
方針2:cronの環境は普段のシェルと違うと心得る
cronで最もよくある失敗は、手動では動くのにcronだと動かない、というものです。原因の多くは環境の違いです。cronから起動されるプロセスは、ログインシェルとは違い、PATHなどの環境変数が最小限しか設定されていません。普段使っている設定ファイルも読み込まれないことが一般的です。
- コマンドはフルパスで書くか、スクリプト冒頭でPATHを明示する
- スクリプト内で使うファイルは絶対パスで指定する
- 作業ディレクトリに依存しないよう、最初にcdするか、パスを固定する
- ロケールや時刻に依存する処理は、必要な環境変数をスクリプト内で設定する
「普段の自分のシェルとは別の、まっさらな環境で動く」と思っておくと、多くのトラブルを事前に避けられます。
方針3:出力とログを必ず残す
朝の自動実行は、誰も見ていない時間に走ります。つまり、失敗しても気づけません。だから、何が起きたかを後から追えるようにしておく必要があります。
標準出力と標準エラー出力をファイルへリダイレクトし、実行日時が分かる形で残すのが基本です。ログが際限なく増えないよう、日付ごとにファイルを分ける、古いものを定期的に消す、といった管理も考えておきます。
もうひとつ知っておきたいのは、cronは出力があると、設定によってはメールで通知しようとする点です。メールの受け取り環境が整っていないと、出力が行き場を失います。そのため、出力は自分でファイルに受けると決めておくほうが安全です。
方針4:二重起動と実行漏れを想定する
毎朝一回の処理でも、前回の実行が長引いて次の実行と重なる可能性はゼロではありません。特にネットワーク越しの処理や、大きなファイルを扱う処理では起こりえます。重なると、同じファイルを同時に書き換えて壊してしまうことがあります。
- flockなどのロックの仕組みで、同時に二つ動かないようにする
- 処理を何度実行しても同じ結果になるよう、冪等に作る
- 途中で失敗しても、中途半端な状態が残らないようにする
実行漏れも同じくらい重要です。cronは、マシンが停止していた時間帯の分を後から埋め合わせてくれるわけではありません。ノートPCのように常時起動していない環境では、朝の時刻に電源が入っていないこともあります。その場合は、起動時に取りこぼしを補う仕組みや、そもそも常時稼働するマシンに載せることを検討してください。
方針5:失敗に気づける仕組みを用意する
ログを残しても、見に行かなければ意味がありません。理想は、失敗したときだけ自分に知らせが届く形です。スクリプトの終了コードを見て、異常があれば通知を送る。あるいは、成功したときに最終更新の記録を残し、それが古くなっていないかを別の手段で確認する。どちらの考え方でも構いませんが、「何も起きていない」ことと「動いていない」ことを区別できる設計にしておくのが肝心です。
通知の手段は、メール、チャットツールへの投稿、手元のメモファイルの更新など、自分が日常的に目にする場所を選ぶのが続けるコツです。
時刻の決め方にも少しだけ配慮を
最後に時刻の話です。朝の作業だからと、きりのいい時刻に設定する人は多いはずです。ただ、同じ時刻に複数の処理が集中すると、負荷が重なったり、外部サービス側が混み合ったりすることがあります。数分ずらすだけで改善する場合もあります。また、自分が起きて使い始める時刻より前に結果が揃っているように、余裕を持った時刻にしておくと安心です。
夏時間のある地域のタイムゾーンを使う場合は、時刻の切り替えで実行が飛んだり重なったりすることがあります。日本の標準時のみで動かすなら気にする場面は少ないですが、サーバーのタイムゾーン設定が意図したものかどうかは、一度確認しておくとよいでしょう。
小さく始めて、育てていく
cronでの自動化は、仕組みとしては単純です。だからこそ、前提の整理と、失敗したときの備えで差が出ます。最初から完璧を目指す必要はありません。まずは手動で動くスクリプトを作り、cronの環境差に注意して登録し、ログを残す。ここまでできれば十分に実用になります。そのうえで、ロックや通知を少しずつ足していけば、朝の定型作業は静かに、確実に片付くようになります。
手順を書き出し、任せ、見守る。この三つを意識すれば、cronは毎朝の頼れる味方になってくれるはずです。
コメントを残す