cronで定期実行する基本|crontabの5つの欄の読み方、動かないときの原因と確かめ方
重複実行と時刻のずれに備える
定期実行のジョブを長く動かしていると、時間に関わるトラブルが起きることがあります。
前回の処理が終わらないうちに次が始まる
5分ごとのジョブが、たまたま10分かかったとします。cron は前回の処理が終わったかどうかを気にせず次を起動するので、同じ処理が二つ同時に動くことになります。ファイルの書き込みが重なってデータが壊れたり、負荷が積み重なったりする原因になります。
Linux では、flock というコマンドで重複実行を防ぐ方法がよく使われます。
*/5 * * * * /usr/bin/flock -n /tmp/fetch.lock /home/user/bin/fetch.sh
flock -n は、指定したロックファイルを誰かが使っている間はコマンドを実行せずにすぐ終わる、という意味です。これで、前回の処理が終わるまで次の処理が始まらなくなります。
タイムゾーンを確かめる
cron は、マシンに設定されたタイムゾーンの時刻で動きます。クラウドのサーバーなどでは、タイムゾーンが協定世界時(UTC)のままになっていることがあり、日本時間の3時のつもりで書いたジョブが、日本時間では昼に動くことがあります。date コマンドで、マシンの時刻とタイムゾーンを最初に確かめておきます。
夏時間のある地域での注意
夏時間(サマータイム)を採用している地域のタイムゾーンでは、時刻が飛んだり重なったりする日に、ジョブが実行されなかったり二回実行されたりすることがあります。日本時間で動かしている場合は気にしなくてよいですが、海外の時刻で動くサーバーを扱うときは、切り替わりの時間帯を避けて時刻を選ぶと安全です。
止まっていた時間のジョブは実行されない
cron は、その時刻にマシンが動いていて初めてジョブを実行します。夜中に電源を切ったりスリープさせたりするパソコンでは、その時間帯のジョブは実行されず、後から自動で取り戻すこともありません。電源を切ることが多いマシンでは、実行漏れを後から補う anacron や、systemd の timer で取りこぼしを補う設定を検討します。
cron 以外の選択肢
定期実行の仕組みは cron だけではありません。環境によっては、別の仕組みの方が向いていることもあります。

systemd timer
最近の多くの Linux ディストリビューションでは、systemd の timer でも定期実行ができます。設定ファイルは二つ必要で cron より手間はかかりますが、実行結果がシステムのログにまとまり、前回の実行時刻や次の予定を一覧で確かめられます。取りこぼした実行を起動後に補う設定もあります。
Mac の launchd
Mac でも cron は使えますが、Apple は launchd という仕組みを推奨しています。スリープ中に予定時刻を過ぎたジョブを、起きたときに実行するといった Mac に合った動きができます。
Windows のタスク スケジューラ
Windows では、タスク スケジューラが同じ役割を担います。画面から操作でき、ログオン時やアイドル時など、時刻以外のきっかけでも実行できます。
どの仕組みでも、「絶対パスで書く」「出力を残す」「重複に備える」という考え方は共通です。cron で身につけた確認の手順は、ほかの仕組みに移っても役立ちます。
まとめ
cron は、決まった時刻にコマンドを実行する定番の仕組みで、設定は crontab に「分 時 日 月 曜日 コマンド」の形で一行ずつ書きます。分の欄から決める、日と曜日を両方指定すると「どちらか」で動く、% は \% と書く、といった書き方の注意を押さえておくと、思わぬ時刻に動く失敗を防げます。
手で動くのに cron で動かないときは、PATH、カレントディレクトリ、% 記号、シェルの違いを順に疑います。出力は >> ログ 2>&1 で残し、重複実行が心配なら flock を使い、マシンのタイムゾーンも最初に確かめます。
最初の一歩として、date の結果をファイルに追記するだけの一行を、5分ごとの指定で crontab に登録してみてください。ログファイルに時刻が増えていくのを確かめたら、その行を消して、本当に自動化したい処理へ置き換えていきましょう。
よくある質問
cron と crontab は何が違いますか?
cron は、決められた時刻にコマンドを実行する常駐プログラムのことです。crontab は、その実行予定を書いた設定ファイル、またはその設定を編集するためのコマンドを指します。
パソコンの電源が切れていた時刻のジョブはどうなりますか?
cron は、その時刻にマシンが動いていなければジョブを実行せず、あとから取り戻して実行することもありません。電源を切ることが多いマシンでは、実行漏れを補う仕組み(anacron や systemd の timer の設定など)を検討します。
Windows でも cron は使えますか?
Windows には cron はなく、同じ役割は「タスク スケジューラ」が担います。WSL の中で cron を使うこともできますが、WSL やその中のサービスが起動していないとジョブは動かないので、常時動かしたい用途には向かない場合があります。
毎分実行のジョブを書いてもマシンに負担はありませんか?
処理が軽ければ大きな問題になることは少ないですが、前回の処理が終わらないうちに次が始まって重なると、負荷が増えたりデータが壊れたりする原因になります。間隔は必要な頻度に合わせ、重複実行を防ぐ仕組みも入れておくと安心です。
crontab -r を誤って実行してしまいました。元に戻せますか?
crontab -r は確認なしに自分の crontab を削除するため、多くの環境では元に戻す手段がありません。日頃から crontab -l の出力をファイルに保存しておくと、誤って消したときにも書き戻せます。











コメント
まだコメントはありません。最初の感想をどうぞ。