【完全マスター】cronでタスクをスケジューリングする方法

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年5月)

✔このような方へ向けて書かれた記事となります

「cronの使い方が知りたい」

「cronでできることを詳しく教えて」

「cronの実例が見たい」

✔当記事を通じてお伝えすること

  • cronとは?
  • cronの基本やその書き方
  • cronを使用した実例

当記事では、cronの基本はもちろん、その使い方を実例付きで丁寧に解説しています。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

cronに必要な基礎知識3選

まずはcronで最低限必要な前提知識を確認していきます。

必ず目を通し、理解してから進みましょう。

  • cronとは
  • cronの重要性と主な用途
  • cron構文の基本

cronとは

cronは、定期的に繰り返し実行されるタスク(ジョブ)をスケジューリングするためのプログラムです。

cronはバックグラウンドで動作し、指定した時刻や間隔でコマンドやスクリプトを実行できます。

cronの重要性と主な用途

cronはシステム管理者や開発者にとって非常に重要なツールです。

主な用途はこちら。

  • バックアップの作成
  • ログのローテーション
  • データベースのメンテナンス
  • 定期的なレポート作成

定期的に実行する必要があるタスクの自動化が主な用途になります。

cron構文の基本

cronジョブのスケジュールは、5つのフィールドで指定されます。

これらのフィールドは、分、時間、日、月、曜日を表しており、それぞれ特定の値の範囲内で設定します。

各フィールドは空白文字で区切られ、コマンドまたはスクリプトが続きます。

たとえば以下は、毎週月曜日の午前3時にタスクを実行することを意味します。

0 3 * * 1

cronにおける必須用語4選

cronコマンドを使うと必ず出てくる用語を覚えましょう。

  • cronデーモン
  • crontabファイル
  • cronジョブ
  • インタラクティブな構文チェッカー

cronデーモン

cronデーモンは、システム内で定期的に実行されるタスクをスケジュール管理するプロセスです。

デーモンはバックグラウンドで動作し、設定されたタスクを実行するためにコンピュータのリソースを利用します。

crontabファイル

crontab(cron table)ファイルは、cronデーモンが実行するタスクを定義するテキストファイルです。

各ユーザーは自分のcrontabファイルを持ち、編集できます。

システム全体のタスクは、システム管理者が管理するシステム用のcrontabファイルに記述されます。

cronジョブ

cronジョブは、定期的に実行されるタスクのことを指します。

ジョブは、実行するコマンドやスクリプトと、それを実行するスケジュール(日時や間隔)が定義されています。

インタラクティブな構文チェッカー

インタラクティブな構文チェッカーは、cron構文の正確性を確認するためのオンラインツール。

これにより、誤った構文でタスクが実行されないように、事前に確認ができます。

cronの構成要素と特殊文字

cronで指定する時間や使われる特殊文字を一覧にしました。

特殊文字により、いつタスクを実行するのかを指定できるのです。

項目指定範囲説明
0-59分フィールドは、0から59の範囲で指定します。「30」 – 毎時30分にタスクが実行されます。
時間0-23時間フィールドは、0から23の範囲で指定します。「6」 – 毎日午前6時にタスクが実行されます。
1-31日フィールドは、1から31の範囲で指定します。「15」 – 毎月15日にタスクが実行されます。
1-12月フィールドは、1から12の範囲で指定します。「7」 – 毎年7月にタスクが実行されます。
曜日0-7曜日フィールドは、0から7の範囲で指定します。0と7は日曜日を表す。「1」 – 毎週月曜日にタスクが実行されます。
コマンド実行するコマンドまたはスクリプトを記述します。シェルコマンドや実行可能なファイルへのパス
特殊文字「*」任意の値を表します。「*」
特殊文字「/」間隔を表します。「/」
特殊文字「-」範囲を表します。「-」
特殊文字「,」複数の値を指定する際に使います。「,」

実践: cronジョブの作成と編集

cronジョブを作成していきます。

実践例を見たほうが、すぐに使いこなせるようになるでしょう。

  • crontabの作成と編集方法
  • シンプルなcronジョブの例
  • 繰り返しタスクの設定方法

crontabの作成と編集方法

crontabファイルの作成や編集には、コマンドラインで以下のように実行します。

crontab -e

これにより、デフォルトのテキストエディタでcrontabファイルが開かれます

新しいタスクを追加するには、適切な構文でcronジョブを記述し、ファイルを保存して閉じます。

シンプルなcronジョブの例

例えば、毎日午前3時にバックアップを取るタスクを設定するには、以下のようなcronジョブを記述します。

0 3 * * * /path/to/backup-script.sh

これにより、指定されたスクリプトが毎日午前3時に実行されます。

順番はこのようになっています。

分 時間 日 月 曜日

繰り返しタスクの設定方法

特定の間隔でタスクを実行するには、「/」記号を使用します。

たとえば、2時間ごとにタスクを実行するには、以下のように記述します。

0 */2 * * * /path/to/some-script.sh

時間の箇所が「*/2」で、2時間起きを意味します。

設定後の確認は以下のコマンドで可能です。

crontab -l

【実例】cronジョブを設定する実例集3選

こちらでは具体的な設定方法をご覧いただきます。

  • 3日に一度サーバーをアップデート
  • 毎日2時に特定のフォルダをバックアップ保存
  • 特定のフォルダをscpコマンドで、別サーバーへ保存

3日に一度サーバーをアップデート

sudo apt update && sudo apt upgrade -yを3日に一度実行します。

0 0 */3 * * sudo apt update && sudo apt upgrade -y

ただし、cronでsudoを使用する場合は、/etc/sudoersファイルにNOPASSWDオプションを追加して、パスワード入力なしでsudoコマンドが実行できるように設定してください。

もしくはrootユーザーで、cronジョブの設定をおこないます。

毎日2時に特定のフォルダをバックアップ保存

/var/www/html内のファイルを毎日2時に、/home/yulikepython/backup/内へ、フォルダ名「日にち_backup」で保存します。

0 2 * * * tar -czf /home/yulikepython/backup/$(date +\%Y\%m\%d)_backup.tar.gz -C /var/www/html .

特定のフォルダをscpコマンドで、別サーバーへ保存

特定のフォルダ「folder1」をscpコマンドで、別のサーバーへ保存します。

0 1 * * * scp -r /path/to/folder1 user@remote_host:/path/to/destination

scpコマンドを使うには、sshの設定をおこなう必要があります。

詳しくはこちらでご覧ください。

CRONジョブのログ・確認方法

CRONの設定が正しく動いているかを確認する方法をお伝えします。

以下の順序で見ていきましょう。

  • 設定したCRONジョブについて
  • 確認の手順

設定したCRONジョブについて

設定したCRONジョブは、毎日OSのアップデート&アップグレードをおこなうこと。

rootユーザーに変更のうえ、crontab -e で以下のように設定しました。

# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
20 10 * * * apt update && apt upgrade -y

一番下の行を追記しています。

確認の手順

実施されているかを調べるのは以下の手順です。

  1. rootユーザーになる
  2. syslogのタイムゾーンを調べる
  3. syslogを見る
  4. history.logを見る

1. rootユーザーになる

rootユーザーで作成したCRONジョブなので、ユーザーをrootにします。

su - 

2. syslogのタイムゾーンを調べる

syslogのタイムゾーンを知っておく必要があります。

cat /etc/timezone
Etc/UTC

こちらではUTCなので、表示されている時間+9時間したものが日本時間です。

3. syslogを見る

syslogにはログがたくさん記録されています。

grepでCRONに関するものだけ抽出しましょう。

grep -E "CRON.*update|CRON.*upgrade" /var/log/syslog

4. history.logを見る

念の為、history.logを見ると、apt updateコマンドの日付けがわかります。

$ cat /var/log/apt/history.log
#ほかにも表示されます。
Start-Date: 2023-05-07  10:20:09
Commandline: apt upgrade -y
Upgrade: bind9-dnsutils:amd64 (1:9.16.1-0ubuntu2.12, 1:9.16.1-0ubuntu2.14), bolt:amd64 (0.9.1-2~ubuntu20.04.1, 0.9.1-2~ubuntu20.04.2), update-notifier-common:amd64 (3.192.30.16, 3.192.30.17), libsystemd0:amd64 (245.4-4ubuntu3.20, 245.4-4ubuntu3.21), ubuntu-advantage-tools:amd64 (27.13.6~20.04.1, 27.14.4~20.04), bind9-host:amd64 (1:9.16.1-0ubuntu2.12, 1:9.16.1-0ubuntu2.14), udev:amd64 (245.4-4ubuntu3.20, 245.4-4ubuntu3.21), libudev1:amd64 (245.4-4ubuntu3.20, 245.4-4ubuntu3.21), libapparmor1:amd64 (2.13.3-7ubuntu5.1, 2.13.3-7ubuntu5.2), systemd-timesyncd:amd64 (245.4-4ubuntu3.20, 245.4-4ubuntu3.21), systemd-sysv:amd64 (245.4-4ubuntu3.20, 245.4-4ubuntu3.21), libpam-systemd:amd64 (245.4-4ubuntu3.20, 245.4-4ubuntu3.21), distro-info-data:amd64 (0.43ubuntu1.11, 0.43ubuntu1.13), systemd:amd64 (245.4-4ubuntu3.20, 245.4-4ubuntu3.21), libnss-systemd:amd64 (245.4-4ubuntu3.20, 245.4-4ubuntu3.21), libunwind8:amd64 (1.2.1-9build1, 1.2.1-9ubuntu0.1), apparmor:amd64 (2.13.3-7ubuntu5.1, 2.13.3-7ubuntu5.2), bind9-libs:amd64 (1:9.16.1-0ubuntu2.12, 1:9.16.1-0ubuntu2.14), tzdata:amd64 (2023c-0ubuntu0.20.04.0, 2023c-0ubuntu0.20.04.1)
End-Date: 2023-05-07  10:20:33

CRONで設定した日付けに一致しています。

よくある質問と回答

cronにおけるよくある質問とその回答をまとめました。

事前に知ることで、なにか起こったときのトラブル解決が早まるでしょう。

  • cronジョブが実行されない場合の対処法
  • cronとanacronの違いは何ですか?
  • システムのタイムゾーンは、ジョブに影響を与えるか?
  • その他のよくある質問

cronジョブが実行されない場合の対処法

cronジョブが実行されない場合、構文エラーやファイルパーミッションの問題が考えられます

cronログを確認し、エラーメッセージをもとに問題を特定して解決してください。

cronとanacronの違いは何ですか?

cronは定期的なタスクを指定した時刻に実行するのに対し、anacronはシステムが稼働している間にタスクを実行します。

したがって、システムがダウンしているときに予定されていたタスクが実行されないcronとは異なり、anacronはシステムが再起動された後にタスクを実行します。

システムのタイムゾーンは、ジョブに影響を与えるか?

はい、cronジョブはシステムのタイムゾーンに従って実行されます。

タイムゾーンを変更した場合は、その影響を考慮してcronジョブのスケジュールを調整する必要があります。

また、異なるタイムゾーンを考慮してスケジュールを設定する場合は、環境変数でタイムゾーンを指定することもできます。

その他のよくある質問

他にも、パーミッションの問題、環境変数の設定、シェルスクリプトのエラーなど、さまざまな質問があります。

具体的な問題に対しては、適切な解決策や参考資料を提供することが重要です。

cronジョブの管理とトラブルシューティング

cronジョブを管理するためにトラブルシューティングの方法などを共有します。

それぞれご確認してください。

  • crontabの一覧表示
  • cronジョブの削除
  • cronジョブのログを確認する方法
  • エラーのトラブルシューティング

crontabの一覧表示

自分のcrontabファイルに登録されているジョブを確認するには、以下のコマンドを使います。

crontab -l

システム全体のジョブを確認するには、システム管理者権限が必要です。

cronジョブの削除

crontabファイルからジョブを削除するコマンドはこちら。

crontab -r

特定のジョブだけを削除する場合は、「crontab -e」でファイルを開いて、該当する行を削除し、ファイルを保存します。

cronジョブのログを確認する方法

cronジョブのログは、通常、/var/log/cronまたは/var/log/syslogに記録されます。

ログファイルを確認することで、ジョブの実行状況やエラーメッセージを把握できます。

エラーのトラブルシューティング

cronジョブに関連するエラーは、ログファイルや構文チェッカーを使って特定できます。

問題を特定したら、適切な修正を行い、再度ジョブを実行して確認します。

セキュリティとベストプラクティス

cronジョブで気を付けるべき点やベストプラクティスをご紹介します。

以下をよく理解して、実践してください。

  • cronジョブの実行ユーザー
  • 権限管理
  • セキュリティ上の注意点
  • バックアップと復元

cronジョブの実行ユーザー

cronジョブは、通常、ジョブを設定したユーザーの権限で実行されます。

しかし、特定のユーザーの権限で実行する必要がある場合や、システム全体のタスクを実行する場合は、rootユーザーでcronジョブの設定も可能。

ただし、セキュリティの観点から、必要最低限の権限でジョブを実行することが推奨されます。

権限管理

cronジョブに関連するファイルやスクリプトのパーミッションを適切に設定し、不必要なアクセスを制限することが重要です。

また、アクセス権限を持つユーザーも厳密に管理し、セキュリティリスクを最小限に抑えることが求められます。

セキュリティ上の注意点

cronジョブを使用する際のセキュリティ上の注意点には、以下のようなものがあります。

  • 適切な権限でジョブを実行する
  • センシティブな情報を含むファイルやスクリプトに対するアクセス制限を適切に設定する
  • ジョブの実行結果を確認し、予期しない動作やエラーを検出する
  • システム全体のcronジョブに対するアクセスを制限する

バックアップと復元

定期的にバックアップを取ることで、システム障害やデータ損失のリスクを軽減できます。

また、万が一の際にはバックアップからデータを復元できるよう、復元手順を確立しておくことが重要です。

その他のスケジューリングツールと比較

cronとほかのスケジューリングツールを比較してみます。

どちらでも、ご自身で使いやすい方で実践しましょう。

  • systemdタイマー
  • atコマンド
  • オープンソースのスケジューリングツール
  • 各ツールの利点と欠点

systemdタイマー

systemdタイマーは、システム起動時や特定の時間にサービスを実行するためのツールです。

cronと比較して、より柔軟なスケジューリングが可能であり、依存関係を考慮した実行ができます。

atコマンド

atコマンドは、特定の時間に一度だけタスクを実行するためのツールです。

予定されたタスクが終了すると、atジョブは自動的に削除されます。

オープンソースのスケジューリングツール

他にも、オープンソースのスケジューリングツールがいくつか存在します。

例えば、CeleryやApache Airflowなどがあり、それぞれ異なる特徴や用途に適した機能を提供しています。

これらのツールは、より複雑なタスクの管理や分散環境でのスケジューリングが必要な場合に活用できます。

各ツールの利点と欠点

それぞれのスケジューリングツールは、利点と欠点があります。

cronはシンプルで広く使われているため、学習コストが低いですが、柔軟性に欠けることがあります。

systemdタイマーやオープンソースのスケジューリングツールは、柔軟なスケジューリングや複雑なタスク管理が可能ですが、学習コストが高いことが欠点です。

まとめ

cronコマンドは、定期的なタスクを自動化するための非常に有用なツールです。

適切な構文と設定をマスターすれば、システム管理やデータ処理など、さまざまな用途で活用できます。

今後の学習へのステップとして、実際にcronジョブを作成し、管理やトラブルシューティングを行ってみることがおすすめです。

また、他のスケジューリングツールや高度な使用例についても学ぶことで、より幅広い知識とスキルを身につけられるでしょう。

タイトルとURLをコピーしました