わたしは"cron = タスクのスケジュール実行"という役割を認識をしていて、知識としては知っていましたが、実際に設定したことはありませんでした。
特にサーバのシャットダウンの定期実行は、AWSだとAmazon EventBridgeを使っていて、OS上で設定したことがなかったのです。
今回の記事では、cronの使い方やユースケース、実際の設定方法を紹介します。
改めてcronについて調べてみた
■1. cronとは何か?
まずはcronについて、調べてみました。
cron は、タスク (別名ジョブ) を定期的に実行するためにスケジュールを設定するサービスです。cron のジョブは、設定した時間にシステムが稼働している場合のみ実行されます。ユーザーは、cron テーブルファイル (crontab ファイルとも呼ばれます) で cron ジョブを指定します。その後、これらのファイルは crond サービスが読み取り、ジョブを実行します。 RedHatより
■2. cronの基本とは?
cronデーモンは常にシステム上で動作しており、crontab ファイルに従って、定期的に指定されたコマンドやスクリプトを自動的に実行します。
crontab は、cronのスケジュールを設定するためのファイルであり、crontab コマンドを使って編集します。
●crontabの書式
crontabファイルの書式は次の通りです。
分 時 日 月 曜日 コマンド
各フィールドの詳細は次の通りです。
- 分(0〜59)
- 時(0〜23)
- 日(1〜31)
- 月(1〜12)
- 曜日(0〜7) ※0と7はどちらも日曜日を表す
- コマンド: 実行するコマンドやスクリプトのパス
●crontabの例
毎日夜8時にシステムをシャットダウンする場合は、
0 20 * * * /sbin/shutdown -h now
- 0 20: 20時0分(午後8時)を表します。
- *: すべての値を意味します。日・月・曜日に特定の値を指定しないため、毎日実行されます。
- /sbin/shutdown -h now: システムをシャットダウンするコマンドです。
■3. crontabコマンドを使ったユーザーごとの設定
各ユーザーは自分専用の crontab ファイルを持つことができ、個別にスケジュールされたタスクを設定できます。root 以外のユーザーでも、自分の権限でタスクをスケジュールできます。
●ユーザーごとのcrontab設定手順
1.crontabを編集
crontab -e コマンドを使用して、ユーザー専用の crontab ファイルを開きます。
crontab -e
2.ジョブの追加:
上述のフォーマットでジョブを追加します。例えば、毎日午前2時にバックアップスクリプトを実行したい場合は、
0 2 * * * /home/user/backup.sh
3.ジョブの確認
現在設定されているジョブを確認するには、次のコマンドを使います。
crontab -l
4.ジョブの削除
すべてのジョブを削除するには、次のコマンドを使います。
crontab -r
■4. /etc/crontab を使ったシステム全体の設定
システム全体のタスクをスケジュールする場合は、/etc/crontab ファイルを使います。このファイルは、特定のユーザーに対してタスクを実行させることができ、root権限で編集します。
●/etc/crontab の書式
/etc/crontab には、ユーザー指定フィールドが追加されます。
分 時 日 月 曜日 ユーザー コマンド
- ユーザー: どのユーザーの権限でコマンドを実行するか指定します。
●手順
1./etc/crontabを開いて編集
管理者権限で /etc/crontab を開きます。
sudo vim /etc/crontab
2.ジョブを追加
例えば、毎日20時に root ユーザーでシステムをシャットダウンする場合は、
0 20 * * * root /sbin/shutdown -h now
3.保存して終了
保存後、cronデーモンは自動的に変更を反映します。サービスの再起動は不要です。
■5. 他のcronディレクトリの活用方法
Linuxでは、/etc/crontabやユーザーごとのcrontab以外にも、特定のディレクトリを使ってシステム全体のタスクを簡単に管理する方法が提供されています。
それが/etc/cron.d/や/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthlyといったディレクトリの活用です。
これらのディレクトリを使うことで、個別のサービスやアプリケーションごとのジョブを効率よく設定できる上、時間ベースで簡単にジョブを管理することが可能です。
1. /etc/cron.d/ ディレクトリの活用
/etc/cron.d/ ディレクトリには、個別のサービスやアプリケーションごとの専用のcronジョブを設定するためのファイルを追加できます。
各ファイルは/etc/crontabと同じフォーマットで記述され、システム全体のジョブとして扱われます。このディレクトリを使うことで、アプリケーションごとに設定を分けられるため、管理がしやすくなります。
●手順
/etc/cron.d/ ディレクトリ内に新しい設定ファイルを作成し、ジョブを記述します。ファイル名は任意です。
sudo vim /etc/cron.d/my_app_job
ジョブを追加します。たとえば、毎日午前1時に特定のスクリプトを実行する設定は次のようになります:
0 1 * * * root /usr/local/bin/my_script.sh
保存して終了すると、設定が反映されます。
2. /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly の活用
これらのディレクトリは、特定の時間単位(毎時、毎日、毎週、毎月)でジョブを自動実行させたい場合に便利です。これらのディレクトリにシェルスクリプトを配置するだけで、設定時間に基づいてタスクが自動的に実行されます。
●手順
実行したいスクリプトを、該当するディレクトリにコピーします。
- /etc/cron.hourly/ – 毎時実行されるスクリプト用
- /etc/cron.daily/ – 毎日実行されるスクリプト用
- /etc/cron.weekly/ – 毎週実行されるスクリプト用
- /etc/cron.monthly/ – 毎月実行されるスクリプト用
sudo cp my_script.sh /etc/cron.daily/
スクリプトに実行権限を付与します
sudo chmod +x /etc/cron.daily/my_script.sh
まとめ
今回、cronについて詳しく調べてみました。普段はcrontabコマンドを使って個別のcronジョブを設定していましたが、実際には/etc/crontabファイルを使った設定方法や、システム全体でのジョブ管理の違いについても理解を深めることができました。このファイルは、システム全体に影響するジョブを設定する際に重要な役割を果たします。
crontabコマンドを使うことで、特定のユーザーごとにジョブを設定するのが一般的ですが、システム全体のタスク管理には/etc/crontabや/etc/cron.dディレクトリを活用する必要があり、それぞれの用途に応じた正しい使い方を理解することが大切です。
↓ほかの協栄情報メンバーもLinuxについての記事を公開しています。ぜひ参考にしてみてください。
■【Linux】rsyncコマンドについて理解を深める(ito.d)
■カーネルコマンドラインを使ってブート時にSELinuxを無効化する。(yamada.y)
■【SadServers】ブラウザでLinuxを触れるLinux学習サイトと教育コストの話(kioka)