ノート:

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タイマーをさらに詳しく調べることをお薦めします。ただし、このチュートリアルでは、平均ユーザーに適した基礎トレーニングを提供しています。

必要事項

目的

この章では、次の操作を学びました。

crontabファイルの内容をリストします

ノート:無料の演習環境を使用する場合は、接続やその他の使用方法の手順について、Oracle Linuxの演習の基本を参照してください。

crontab -lコマンドを使用して、crontabファイルの内容をリストします。

crontab -l

ユーザーのcrontabエントリが存在しない場合は、次のメッセージが表示されます。

no crontab for oracle

crontabの作成または編集

  1. crontab –eコマンドを使用して、デフォルトのエディタでcrontabを開きます。

    crontab -e
    

    Oracle Linux 8のデフォルト・エディタはvimエディタです。

  2. ファイルの末尾に次の行を追加して、1分ごとにechoコマンドを実行するcrontabジョブを作成します。

    * * * * * echo "Hello World"
    

    vimの場合:

    • [Shift]を押しながら[g]を押すと、ファイルの最下部にジャンプできます。
    • 「i」キーを押して挿入モードに入ります。
    • crontab行を入力します。
    • [Esc]キーを押して挿入モードを終了します。
    • 「:wq」と入力してファイルを書き込んだり、エディタにしたりできます。

    このステップでは、crontabがインストールされ、即時にアクティブになります。

    crontab: installing new crontab
    
  3. 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)

この出力には、コマンドが実行されているユーザー、実行されたコマンド、およびコマンド出力が表示されます。

postfixsendmailなどのMTAがインストールされている場合、crontabエントリから、crontabエントリが実行されているユーザーのメールスプールへの出力をcrontabエントリから送ります。詳細は、このチュートリアルの後半で説明します。

Crontabの時間シーケンス・オプション

Crontabの時間フィールドは、次の順序で定義されています。

任意の時間フィールド内で特殊文字を使用できます。

crontabでは、特別な短縮形を使用して、一般的な時間要件の時間フィールドを置き換えることもできます。この短縮策には、再起動後にコマンドを実行するオプションも含まれています。

crontabは1分間の粒度のみを提供することに注意してください。毎分より頻繁に実行されるcrontabエントリを設定することは容易ではありません。これを処理できるツールを探している場合は、Systemdタイマーユニットを調べることを検討してください。

crontabを編集して、異なる時刻シーケンスで異なる実行中のコマンドを試行します

  1. crontab –eコマンドを使用して、デフォルトのエディタでcrontabを開きます。

    crontab -e
    
  2. 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"
    
  3. crontabファイルを保存して終了します。

Crontabコマンドの構文

crontabコマンドは、crontabが属するユーザーの資格証明で実行され、次のようなデフォルトの環境変数セットで実行されます。

代替環境変数は、時間フィールドを含まない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を編集してコマンド構文を試します

  1. crontab -eコマンドを使用して、エディタでcrontabを開きます。

  2. 次のエントリを追加します。

    */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を参照してください。

  3. ファイルを保存して終了します。

1分以内に、$HOMEディレクトリにcrontab.logファイルが表示されます。このファイルの内容を表示するには、次を実行します。

tail $HOME/crontab.log

ローカルメールスプール内のcrontab出力にアクセスします

MTAがインストールされている場合、すべてのcrontab出力は、デフォルトでユーザーのシステムメールスプールに送信されます。

ノート:次の手順は例でのみ使用でき、メール転送エージェント(MTA)の完全な構成については説明しません。構成のデフォルトがインストールに適していない可能性があります。システムでpostfixを有効にする場合は、『Oracle Linux: Install the Postfix Email Server』も参照してください。

crontabメール処理が正しく機能するには、MTAを正しくインストール、構成、および有効にする必要があります。この演習では、次のステップを実行して、postfix MTAがローカル・メールを処理できるようにすることができます。

  1. postfixパッケージをインストールします。

    sudo dnf install -y postfix
    
  2. postfixサービスを有効にして起動します。デフォルト構成では、postfixをローカル配信MTAとしてのみ有効にします。

    sudo systemctl enable --now postfix.service
    
  3. クランド・サービスを再起動し、ポストフィックス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ユーティリティー

詳細情報

その他の学習リソース

docs.oracle.com/learnの他のラボを調べるか、Oracle Learning YouTubeチャネルでさらに無料の学習コンテンツにアクセスします。さらに、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerにします。

製品ドキュメントは、Oracleヘルプ・センターを参照してください。