ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で入手できます。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントに例の値を使用します。演習を完了するときは、これらの値をクラウド環境に固有の値に置き換えます。
Oracle LinuxでタスクをスケジュールするためのCrontabユーティリティの使用
開始する前に
このチュートリアルでは、Oracle Linuxでcrontabコマンドを使用する方法を示します。このチュートリアルはOracle Linux 8ユーザーを対象としていますが、コマンドは他のOracle Linuxリリースでも入手できます。
バックグラウンド
Oracle Linuxでは、スケジュールされたタスクまたはジョブとしてプログラムを自動的に実行できます。/etc/cron*
でcron構成を編集してシステム・レベルのタスクとして実行するようにプログラムをスケジュールするか、ユーザーcrontab内でジョブとして実行するプログラムをスケジュールできます。システムに対するシステム管理者アクセス権がない場合、またはスケジュールするプログラムがユーザー・アカウントに固有である場合は、crontabユーティリティによって、独自のユーザー資格証明の下で定期的にプログラムを実行するための適切なメカニズムが提供されます。crontabを使用すると、ジョブを1年に1回だけ実行するようにスケジュールできます。ただし、ジョブの実行がスケジュールされている間にシステムが停止している場合、cronジョブは実行されません。
このチュートリアルはOracle Linux 8ユーザーを対象としていますが、crontabはOracle Linux 7でも使用でき、このチュートリアルのコンテンツはそのプラットフォームに等しく適用する必要があります。cron構成はほとんどのLinuxシステムで標準であり、1975年以降はUnix系システムで使用可能です。より複雑なスケジューリング・ソリューションは、タイマーの形でSystemdに含まれており、特定の要件を解決するために、Systemdタイマーをさらに詳しく調べることをお薦めします。ただし、このチュートリアルでは、平均ユーザーに適した基礎トレーニングを提供しています。
必要事項
- Oracle Linuxがインストールされているシステム
目的
この章では、次の操作を学びました。
- 既存のcrontabの内容を一覧表示します
- crontabエントリを作成および編集する
- crontab出力へのアクセス
- ユーザーの完全なcrontabを削除します
crontabファイルの内容をリストします
ノート:無料の演習環境を使用する場合は、接続やその他の使用方法の手順について、Oracle Linuxの演習の基本を参照してください。
crontab -l
コマンドを使用して、crontabファイルの内容をリストします。
crontab -l
ユーザーのcrontabエントリが存在しない場合は、次のメッセージが表示されます。
no crontab for oracle
crontabの作成または編集
-
crontab –e
コマンドを使用して、デフォルトのエディタでcrontabを開きます。crontab -e
Oracle Linux 8のデフォルト・エディタはvimエディタです。
-
ファイルの末尾に次の行を追加して、1分ごとにechoコマンドを実行するcrontabジョブを作成します。
* * * * * echo "Hello World"
vimの場合:
- [Shift]を押しながら[g]を押すと、ファイルの最下部にジャンプできます。
- 「i」キーを押して挿入モードに入ります。
- crontab行を入力します。
- [Esc]キーを押して挿入モードを終了します。
- 「:wq」と入力してファイルを書き込んだり、エディタにしたりできます。
このステップでは、crontabがインストールされ、即時にアクティブになります。
crontab: installing new crontab
-
crontabのエントリをリストして、新しいエントリを表示します。
crontab -l
各ジョブは、crontabの独自の行に表示されます。crontabには、構成できる異なる期間を定義する5つのスペース区切りフィールドがあり、そのあとにジョブに対して実行されるコマンドが続きます。このコマンドは、システム上のコマンド行で実行できる任意のコマンドと同等で、独自のスクリプトを実行したり、パイプやリダイレクション演算子を利用したりできます。
cronエントリ出力を確認します
メール・トランスポート・エージェント(MTA)は、最小限のOracle LinuxシステムまたはOracle Linuxプラットフォーム・イメージにデフォルトでインストールされていません。MTAが見つからない場合、crontabで指定されたコマンドの出力をSyslogデーモンに送信します。Oracle Linux 8の新規インストールでは、/var/log/cron
のログ・ファイルにcrontab出力を表示できます。
次のコマンドを実行して、新しいcrontabエントリによって生成された出力を表示します。
sudo tail /var/log/cron
cronタスクは1分ごとにしか実行されないため、コマンドを実行する前に1分待つ必要がある場合があります。このcronエントリの出力は次のようになります。
Jun 30 12:39:02 ol8-server CROND[68564]: (oracle) CMD (echo "Hello World")
Jun 30 12:39:02 ol8-server CROND[68551]: (oracle) CMDOUT (Hello World)
この出力には、コマンドが実行されているユーザー、実行されたコマンド、およびコマンド出力が表示されます。
postfixや sendmailなどのMTAがインストールされている場合、crontabエントリから、crontabエントリが実行されているユーザーのメールスプールへの出力をcrontabエントリから送ります。詳細は、このチュートリアルの後半で説明します。
Crontabの時間シーケンス・オプション
Crontabの時間フィールドは、次の順序で定義されています。
- minutes: 0 - 59
- 時: 0から23
- day: 1から31
- month: 1から12、または月の名前
- day-of-week: 0から7、または略称。0と7はどちらも日曜日を表すことに注意してください。
任意の時間フィールド内で特殊文字を使用できます。
- アスタリスク(*):フィールドのすべてのインスタンスに対してコマンドを実行することを指定します。
- ハイフン(-):範囲を示すために使用できます。たとえば、「曜日」フィールドでは、タスクを月曜日から金曜日に実行するようにスケジュールするが、土曜日または日曜日には実行しないように1-5を指定できます。
- カンマ(、):フィールドの値リストを指定するために使用できます。たとえば、「時間」フィールドに6,18と指定して、タスクを午前6時と午後6時に実行するようにスケジュールできます。
- スラッシュ(/):ステップ値を指定するために使用できます。たとえば、分フィールドに*/15と指定すると、タスクを15分ごとに実行するようにスケジュールできます。
crontabでは、特別な短縮形を使用して、一般的な時間要件の時間フィールドを置き換えることもできます。この短縮策には、再起動後にコマンドを実行するオプションも含まれています。
- @reboot:再起動後に1回実行します。
- @yearly :「0 0 1 1 *」のように、年に1回実行します。
- @annually :「0 0 1 1 *」のように、年に1回実行します。
- @monthly :「0 0 1 * * *」のように、月に1回実行します。
- @weekly:週に1回(0 0 * * 0)実行します。
- @daily: 1日に1回(0 0 * * *)。
- @hourly: 1時間に1回(0 * * * * *)。
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分以内に、$HOMEディレクトリにcrontab.logファイルが表示されます。このファイルの内容を表示するには、次を実行します。
tail $HOME/crontab.log
ローカルメールスプール内のcrontab出力にアクセスします
MTAがインストールされている場合、すべてのcrontab出力は、デフォルトでユーザーのシステムメールスプールに送信されます。
ノート:次の手順は例でのみ使用でき、メール転送エージェント(MTA)の完全な構成については説明しません。構成のデフォルトがインストールに適していない可能性があります。システムでpostfixを有効にする場合は、『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
-
クランド・サービスを再起動し、ポストフィックスMTAを使用してメール配信の処理を開始します。
sudo systemctl restart crond.service
代替メールアドレスに出力をリダイレクトしたり、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を編集し、削除するジョブの行を削除します。
ビデオ・デモ
Oracle Linux 8でcrontabユーティリティーの操作に関する詳細情報が必要な場合は、https://www.youtube.com/watch?v=BpPGoRYTv9Iにビデオデモが用意されています。
Oracle Linux 8タスクの自動化Cronユーティリティー
詳細情報
man 5 crontab
man systemd.timer
- Oracle Linux: Postfix Eメール・サーバーのインストール
- Oracle Linuxドキュメント
- Oracle Learning Library
その他の学習リソース
docs.oracle.com/learnの他のラボを調べるか、Oracle Learning YouTubeチャネルでさらに無料の学習コンテンツにアクセスします。さらに、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerにします。
製品ドキュメントは、Oracleヘルプ・センターを参照してください。
Use the Crontab Utility to Schedule Tasks on Oracle Linux
F49761-03
May 2022
Copyright © 2021, Oracle and/or its affiliates.