ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で提供されています。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときは、これらの値をクラウド環境に固有の値に置き換えます。
Oracle LinuxでタスクをスケジュールするためのCrontabユーティリティの使用
開始する前に
このチュートリアルでは、Oracle Linuxでcrontabコマンドを使用する方法を示します。
バックグラウンド
Oracle Linuxでは、スケジュールされたタスクまたはジョブとしてプログラムを自動的に実行できます。/etc/cron*
でcron構成を編集してシステム・レベルのタスクとして実行するプログラムをスケジュールするか、ユーザーcrontab内でジョブとして実行するプログラムをスケジュールできます。システムでシステム管理者アクセス権限を持っていない場合、またはスケジュールするプログラムがユーザーアカウントに固有である場合、crontabユーティリティーは、独自のユーザー資格情報で定期的にプログラムを実行するための適切なメカニズムを提供します。crontabを使用すると、ジョブを1分ごとに、または年に1回ほど頻繁に実行するようにスケジュールできます。ただし、ジョブの実行がスケジュールされている間にシステムが停止している場合、cronジョブは実行されないことに注意してください。
cron構成はほとんどのLinuxシステムでは標準であり、1975年以降、Unixのようなシステムで使用可能になっています。より複雑なスケジューリング・ソリューションは、タイマーの形式でSystemdに組み込まれており、ユーザーは、特定の要件を解決するために、より深いシステム・タイマーを検討することをお薦めします。ただし、このチュートリアルでは、平均ユーザーにより適した基礎トレーニングを提供します。
必要事項
- Oracle Linuxがインストールされたシステム
目的
このチュートリアルで次を学習します:
- 既存のcrontabの内容をリストします
- crontabエントリの作成および編集
- crontab出力へのアクセス
- ユーザーの完全なcrontabを削除します
crontabファイルのコンテンツのリスト
ノート: 無料ラボ環境を使用する場合、接続およびその他の使用手順については、Oracle Linux Labの基本を参照してください。
crontab -l
コマンドを使用してcrontabファイルのコンテンツをリストします。
crontab -l
ユーザーにcrontabエントリが存在しない場合は、次のメッセージが表示されます。
no crontab for oracle
crontabの作成または編集
-
crontab –e
コマンドを使用して、デフォルト・エディタでcrontabを開きます。crontab -e
Oracle Linuxのデフォルト・エディタはvimエディタです。
-
ファイルの末尾に次の行を追加して、echoコマンドを毎分実行するcrontabジョブを作成します。
* * * * * echo "Hello World"
vimの場合:
- 'Shift- g'を押して、ファイルの下部に移動できます。
- 「i」キーを押して挿入モードに入ります。
- crontab行を入力します。
- [Esc]キーを押して挿入モードを終了します。
- 「: wq」と入力してファイルを書き、エディタを完成させます。
この手順では、crontabをインストールし、すぐにアクティブにします。
crontab: installing new crontab
-
crontab内のエントリをリストして、新しいエントリを表示します。
crontab -l
各ジョブは、crontabの独自の行に表示されます。crontabには、構成可能な異なる期間を定義する5つのスペース区切りフィールドがあり、そのあとにジョブに対して実行されるコマンドが続きます。このコマンドは、システムのコマンド行で実行できる任意のコマンドと同等であり、独自のスクリプトを実行したり、パイプやリダイレクション演算子を利用したりできます。
cronエントリの出力を確認してください
デフォルトでは、最小限のOracle LinuxシステムまたはOracle Linuxプラットフォーム・イメージにMail Transport Agent (MTA)がインストールされていません。MTAが見つからない場合、cronデーモンはcrontabで指定されたコマンドからの出力をSyslogデーモンに転送します。Oracle Linuxの新しいインストールで、/var/log/cron
のログファイル内のcrontab出力を表示できます。
次のコマンドを実行して、新しいcrontabエントリによって生成された出力を表示します。
sudo tail /var/log/cron
cronタスクは1分ごとに実行されるため、コマンドを実行する前に1分間待機する必要がある場合があります。このcronエントリの出力は次のようになります。
Jun 30 12:39:02 ol-server CROND[68564]: (oracle) CMD (echo "Hello World")
Jun 30 12:39:02 ol-server CROND[68551]: (oracle) CMDOUT (Hello World)
この出力は、コマンドが実行されたユーザー、実行されたコマンド、およびコマンド出力を表示します。
postfixや sendmailなどのMTAがインストールされている場合、crontabエントリからの出力を、crontabエントリが実行されているユーザーのメールスプールに送信します。これについては、このチュートリアルの後半で詳しく説明します。
Crontab時間順序オプション
Crontab時間フィールドは、次の順序で定義されます。
- minutes: 0から59
- Hour: 0から23
- day: 1から31
- month: 1から12、または月の名前
- day- of- week: 0から7、または曜日の短縮名。0と7はどちらも日曜日を表します。
次のいずれかの時間フィールド内で特殊文字を使用できます。
- アスタリスク(*): フィールドのすべてのインスタンスに対してコマンドを実行するように指定します。
- ハイフン(- ): 範囲を示すために使用できます。たとえば、「曜日」フィールドで、タスクを月曜日から金曜日まで実行するようにスケジュールするが、土曜日または日曜日には実行しないようにするには、1- 5を指定します。
- カンマ(、): フィールドの値リストを指定するために使用できます。たとえば、「時間」フィールドで、6,18を指定して、6amおよび6pmで実行するようにタスクをスケジュールできます。
- スラッシュ(/): ステップ値を指定するために使用できます。たとえば、「分」フィールドに*/15を指定して、15分ごとにタスクを実行するようスケジュールできます。
また、crontabでは、特別な短縮拡張を使用して、一般的な時間要件の時間フィールドを置き換えることもできます。重要なこととして、この短縮形には、リブート後にコマンドを実行するオプションも含まれています。
- @reboot: リブート後に1回実行します。
- @yearly: 年ごとに1回実行します。"0 0 1 1 *"。
- @annually: 年ごとに1回実行します。"0 0 1 1 *"。
- @monthly: 月に1回、つまり「0 0 1 * *」を実行します。
- @weekly: 週に1回実行します。"0 0 * * 0"。
- @daily: 「0 0 * * *」のように1日に1回実行します。
- @hourly: 「0 * * * * *」のように1時間に1回実行します。
crontabは1分の粒度のみを提供します。毎分より頻繁に実行されるcrontabエントリを設定するのは簡単ではありません。これを処理できるツールを探している場合は、Systemdタイマーユニットを調べてください。
crontabを編集して、異なる時間シーケンスで実行中のコマンドを試します。
-
crontab –e
コマンドを使用して、デフォルト・エディタでcrontabを開きます。crontab -e
-
crontabに次のエントリを追加します。
*/15 * * * * echo "This crontab entry runs every 15 minutes" 10 * * * * echo "This crontab entry runs at 10 minutes past every hour" 30 13 * * 3 echo "This crontab entry runs at 13h30 on every Wednesday" @reboot echo "This command runs once after a reboot event"
-
crontabファイルを保存して終了します。
Crontabコマンドの構文
crontabコマンドは、crontabが属するユーザーの資格証明の下で実行され、次のようなデフォルトの環境変数が設定されます。
- HOME: crontabが次のように実行されるユーザーのホーム・ディレクトリ
- LOGNAME: crontabが実行されているユーザーのユーザー名と同等です。
- USER: crontabが実行するユーザーのユーザー名
- SHELL: コマンドの実行に使用されるシェル・バイナリ。これはデフォルトで
/bin/sh
に設定されます。 - PATH: crontabユーティリティーで使用可能なパス。これはデフォルトで
/usr/bin:/bin
に設定されます。
別の環境変数は、時間フィールドを含まないcrontab内の行として指定することで設定できます。たとえば、bashシェルを使用し、個人の.bashrc
構成を使用してすべての変数および設定を定期的にインポートする場合、crontabを編集して次のように表示できます。
SHELL=/bin/bash
* * * * * source $HOME/.bashrc;
crontabジョブに対して実行されるコマンドはシェル環境内で実行されるため、標準のシェル構文が適用され、出力のパイプまたはリダイレクトに使用できます。たとえば、すべての出力を /dev/nullにリダイレクトし、結果としてジョブのメール出力を無効にするには、コマンドのSTDOUTおよびSTDERR出力に標準シェルリダイレクトを使用します。
* * * * * /path/to/command > /dev/null 2>&1
または、出力をリダイレクトして、実行されるたびにコマンド出力を追跡するために使用できるファイルに追加することもできます。
* * * * * /path/to/command >> $HOME/command.log
crontabを編集してコマンド構文を試します
-
crontab -e
コマンドを使用して、エディタでcrontabを開きます。 -
次のエントリを追加します。
*/15 * * * * echo "This 'silent' crontab entry runs every 15 minutes but output is redirected to /dev/null" > /dev/null 2>&1 * * * * * echo "The date and time is $(date +\%Y-\%m-\%d\ \%H:\%M:\%S)" >> $HOME/crontab.log
crontabユーティリティによって%文字が改行文字に変更され、最初の%以降のすべてのデータが標準入力としてコマンドに送信されるため、dateコマンドの%文字がエスケープされます。詳細は、
man 5 crontab
を参照してください。 -
ファイルを保存して終了します。
1分以内に、crontab.logファイルが$HOMEディレクトリに表示されます。このファイルの内容を表示するには、次を実行します。
tail $HOME/crontab.log
ローカル・メール・スプール内のcrontab出力にアクセスします
MTAがインストールされている場合、デフォルトでは、すべてのcrontab出力がユーザーのシステムメールスプールに電子メールで送信されます。
ノート: 次の手順は目的のみであり、メール転送エージェント(MTA)の完全な構成については説明しません。構成のデフォルトは、インストールに適していない可能性があります。システムで事後修正を有効にしている場合は、適切に構成する方法については、Oracle Linux: Install the Postfix Email Serverも参照してください。
crontabのメール処理が正しく機能するには、MTAを正しくインストール、構成、および有効にする必要があります。この演習の目的で、次の手順を実行して、postfix MTAがローカルメールを処理できるようにします。
-
postfixパッケージをインストールします。
sudo dnf install -y postfix
-
postfixサービスを有効にして起動します。デフォルトの構成では、Postfixをローカル配信MTAとしてのみ有効化します。
sudo systemctl enable --now postfix.service
-
メール配信を処理するためにpostfix MTAの使用を開始するように、crondサービスを再起動します。
sudo systemctl restart crond.service
出力を代替メール・アドレスにリダイレクトするようにcrontabを構成していない場合、またはcronジョブの出力を破棄するようにcrontabを構成していない場合は、各ジョブの出力がユーザーのローカル・メール・スプールに自動的に配信されます。通常、メール・スプールは単一のメール・ファイルとして格納され、/var/spool/mail/$USERでアクセスできます。最近のアクティビティを単純に監視している場合は、このファイルを調整してメールが配信されたときに表示されるのが最も簡単です。
tail -f /var/spool/mail/$USER
管理可能なインタフェースの各cronジョブの出力を確認するには、mailxパッケージをインストールし、mail
コマンドを使用してメールスプールの内容を表示します。
sudo dnf install -y mailx
mail
メールは次の方法で一覧表示されます。
Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/oracle": 1 messages 1 new
>N 1 (Cron Daemon) Wed Aug 5 23:48 30/1436 "Cron oracle
&
表示するメール・メッセージの番号を入力します。たとえば、1を入力してキューの最初のメッセージを表示します。
& 1
Hello World
header
コマンドを使用してメール・ヘッダーのリストに戻るか、quit
コマンドを使用してアプリケーションを終了します。
crontabにMAILTO環境変数を設定することによって、cron出力をメール送信するために使用される電子メールアドレスを変更できますが、外部メール配信を処理するようにシステムを構成する必要があります。MAILTO環境を空の値に設定すると、出力は破棄され、crontab内の任意のcronジョブに対してメールは送信されません。
crontab全体を削除します
crontab -r
コマンドを使用して、ユーザーのcrontab全体を削除します。
crontab -r
このコマンドは、ユーザー用に指定したすべてのcronジョブエントリを削除します。特定のジョブ・エントリのみを削除する場合は、crontab -e
を使用してcrontabを編集し、削除するジョブの行を削除します。
これらの機能の詳細は、man 5 crontab
およびman systemd.timer
を参照してください。
ビデオ・デモ
Oracle Linuxでcrontabユーティリティを操作する方法の詳細は、Oracle Linux Automating Tasks Cron Utilityでビデオ・デモンストレーションが提供されています。
詳細情報
その他の学習リソース
他のラボをdocs.oracle.com/learnで探すか、Oracle Learning YouTubeチャネルでより無料の学習コンテンツにアクセスします。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品のドキュメントは、Oracle Help Centerを参照してください。
Use the Crontab Utility to Schedule Tasks on Oracle Linux
F49761-04
July 2022
Copyright © 2021, Oracle and/or its affiliates.