ノート:

Oracle Linuxでのシステム時間の管理およびタスクのスケジュール

イントロダクション

Oracle Linuxは、日付と時刻を操作するためのいくつかの方法をユーザーに提供します。これらは手動で変更できますが、chronyなどの Network Time Protocol (NTP)を実装するサービスを構成するのが一般的です。このようにして、システム時間は正しいままになり、cronまたはsystemd timersを使用するタスクはスケジュールどおりに実行されます。

目的

このチュートリアルでは、次のことを学習します。

前提条件

Oracle Linuxのデプロイ

ノート:独自のテナンシで実行している場合は、演習環境をデプロイする前に、linux-virt-labs GitHubプロジェクトREADME.mdを読み、前提条件を完了してください。

  1. Lunaデスクトップでターミナルを開きます。

  2. linux-virt-labs GitHubプロジェクトをクローニングします。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 作業ディレクトリに変更する。

    cd linux-virt-labs/ol
    
  4. 必要なコレクションをインストールします。

    ansible-galaxy collection install -r requirements.yml
    
  5. 演習環境をデプロイします。

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6"
    

    無料の演習環境には、ローカル・ホストで実行される再生のansible_python_interpreterを設定する追加の変数local_python_interpreterが必要です。この変数は、python3.6モジュールの下にあるOracle Cloud Infrastructure SDK for PythonのRPMパッケージが環境によってインストールされるため必要です。

    デフォルトのデプロイメント・シェイプでは、AMD CPUおよびOracle Linux 8が使用されます。Intel CPUまたはOracle Linux 9を使用するには、デプロイメント・コマンドに-e instance_shape="VM.Standard3.Flex"または-e os_version="9"を追加します。

    重要:プレイブックが正常に実行されるまで待機し、一時停止タスクに到達します。プレイブックのこの段階では、Oracle Linuxのインストールが完了し、インスタンスの準備ができました。前回の再生をノートにとります。この再生では、デプロイするノードのパブリックIPアドレスとプライベートIPアドレス、および演習の実行中に必要なその他のデプロイメント情報が出力されます。

システムの日時の構成

Oracle Linuxには、システムの日時を調整するのに役立つ3つの共通コマンドがあります。dateコマンドはシステム時間を調整し、hwclockはRTC時間を調整します。Oracle Linuxでは、RTC時間は、システムの電源切断時に実行を継続するバッテリ・バックアップ・ハードウェア・クロックであるリアルタイム・クロック(RTC)によって保持される時間を表します。ハードウェアクロックのその他の一般的な名前には、CMOSクロックまたはBIOSクロックが含まれます。dateの変更後にRTCクロックを更新する場合は、hwclockを実行する必要があります。

3番目のオプションはtimedatectlです。このコマンドは、datehwclockを組み合せて、時間の設定時にシステムとRTCの両方を更新します。Oracle Linuxなどの最新のsystemdベースのLinuxディストリビューションでは、timedatectlを使用することをお薦めします。

システムクロックの表示と設定

  1. 端末を開き、SSH経由でol-node-01インスタンスに接続します。

    ssh oracle@<ip_address_of_instance>
    
  2. 現在のシステム時間と日付を取得します。

    date
    

    出力には、システムの日付、時刻、およびタイムゾーンがデフォルトの形式で表示されます。dateコマンドの多数の引数を使用して、出力の形式を変更できます。これらの引数は、異なる日付と時刻をスクリプト化または計算する場合に便利です。詳細は、date --helpを実行するか、man dateを使用してマニュアル・ページを参照してください。

  3. システムの時間と日付を調整します。

    sudo date -s "1 JAN 1970 16:00:00"
    
  4. 書式制御引数を使用して、書式を簡略化します。

    sudo date +%Y%m%d -s "20250203"
    

    時間を指定しなかったため、時間部分はすべてのゼロ(午前0時)にデフォルト設定されます。

  5. システム時間を設定します。

    sudo date +%T -s "14:08:14"
    

    dateコマンドを再度実行すると、入力した内容に従って時間が表示されます。

ハードウェアクロックの表示と設定

  1. 現在のハードウェアクロック(RTC)を読み取ります。

    sudo hwclock --show
    
  2. ハードウェアクロックに基づいてシステムクロックを設定します。

    sudo hwclock -s
    

    このコマンドでは、-w関数を渡すことで、クロックを反対方向に設定できます。hwclock --helpを実行するか、マニュアル・ページman hwclockを表示して、追加のファンクションおよびオプションを確認します。

Systemdを使用した日時

  1. 現在の日付と時刻を取得します。

    timedatectl
    

    無料の演習環境での出力は、NTPサービスアクティブであることを示しています。timedatectlを使用して日付と時間の設定を手動で調整するには、最初に無効にする必要があります。

  2. NTP同期を無効にします。

    sudo timedatectl set-ntp no
    
  3. 日付と時間を設定します。

    sudo timedatectl set-time '2014-09-23 14:10:40'
    
  4. 日付と時間を確認します。

    date
    
  5. タイムゾーンの一覧を取得します。

    timedatectl list-timezones
    

    timedatectlコマンドを終了するには、qを押します。

  6. タイムゾーンの設定。

    sudo timedatectl set-timezone 'America/Chicago'
    
  7. 新しいタイム・ゾーンを確認します。

    timedatectl
    
  8. タイム・ゾーンを協定世界時(UTC)に戻します。

    sudo timedatectl set-timezone 'UTC'
    
  9. NTP同期を有効にします。

    sudo timedatectl set-ntp yes
    

    しばらくすると同期が発生し、クロックはタイムゾーン・セットに基づいて現在の日時に戻ります。

Chronyの使用

chronyは、ネットワーク上でタイムキーピングを正確に維持するためにNTPを実装するOracle Linuxの機能で、chronydchronycの2つのコンポーネントで構成されます。chronydは、起動時に有効化および起動できるサービス・デーモンであり、chronycは、chronydのパフォーマンスを監視してランタイム・パラメータを変更するために使用されるコマンドライン・ユーティリティです。

  1. chronyがインストールされているかどうかを確認します。

    dnf list chrony
    

    インストールされていない場合は、sudo dnf install -y chronyを使用してインストールできます。

  2. サービスデーモンのステータスを確認します。

    sudo systemctl status chronyd
    

    非アクティブな場合は、sudo systemctl enable --now chronydを使用してサービスを有効化および開始します。systemctlコマンドを終了するには、qを押します。

  3. システムクロックのパフォーマンスに関する情報を取得します。

    chronyc -n tracking
    

    出力例:

    Reference ID    : A9FEA9FE (169.254.169.254)
    Stratum         : 3
    Ref time (UTC)  : Mon Feb 03 16:07:59 2025
    System time     : 0.000009410 seconds slow of NTP time
    Last offset     : -0.000011537 seconds
    RMS offset      : 0.000015202 seconds
    Frequency       : 22.818 ppm slow
    Residual freq   : -0.004 ppm
    Skew            : 0.222 ppm
    Root delay      : 0.000643811 seconds
    Root dispersion : 0.000107666 seconds
    Update interval : 64.4 seconds
    Leap status     : Normal
    

    説明:

    • Reference ID: これは、コンピュータは現在同期しているサーバーの参照IDと名前(またはIPアドレス)です。出力の参照IDは16進数で表示されます。
    • Stratum: ストラタムは、接続している参照クロックのコンピュータからどのくらいのホップ数、離れているかを示します。
    • 参照時間: システムが参照ソースから最後の測定を処理したUTC時間です。

    詳細は、man chronycを使用してマニュアル・ページを確認してください。

  4. システムで使用するソースのリストを取得します。

    chronyc -n sources
    

    -vオプションを使用すると、表示される各列の列の説明が表示されます。

タスクのスケジュール

Oracle Linuxには、タスクをスケジュールするためのいくつかの方法があり、これらのタスクまたはジョブはシステム・レベルまたはユーザー・レベルで実行できます。cronはこれらの方法の中で最もよく知られていますが、systemdはカレンダーと単調な時間によるスケジューリングの観点から、より柔軟なタイマーを導入し、より広く使用されるようになっています。現在のOracle Linuxディストリビューションには、両方の組合せがあります。

Cronの使用

  1. システム・レベルのcronジョブを確認します。

    sudo ls -al /etc/cron*
    

    この出力には、時間、週、月など、事前に決定されたスケジュールで選択タスクを実行する実行可能スクリプトを含む複数のディレクトリが用意されています。/etc/cron.dディレクトリも存在し、パッケージではシステム/etc/crontabを変更せずにcrontabスニペットを配置できます。

  2. システム・レベルのcronジョブのリストを取得します。

    sudo crontab -l
    

    この出力は、root用のcrontabがないことを示しています。sudoを指定せずに同じコマンドを実行すると、同じ出力がローカル・ユーザー・アカウントに対して提供されます。

  3. ユーザー・レベルのcronジョブを作成します。

    (crontab -l 2>/dev/null; echo  '* * * * * date >> /home/oracle/test') | crontab -
    

    最初のコマンドは no crontabメッセージを回避します。これは最初に入力されたジョブであるため、2番目のコマンドは1分ごとに実行されるジョブを作成します。

  4. crontabが存在することを確認します。

    crontab -l
    

    各ジョブは、crontab内の独自の行に表示されます。crontabには、構成可能な様々な期間を定義する5つのスペース区切りフィールドがあり、その後にジョブを実行するコマンドが続きます。このコマンドは、システム上のコマンド行で実行できる任意のコマンドと同等であり、スクリプトを実行したり、パイプやリダイレクション演算子を利用したりできます。ジョブを編集する場合は、crontab -eコマンドを使用します。これにより、Oracle LinuxのデフォルトのEDITOR (vi)に削除されます。

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

    Crontabでは、次のように時間フィールドを定義します。

    • minute: 0から59
    • hour: 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: 「0 * * * * *」のように1時間に1回実行します。

    crontabの粒度は1分のみです。タスクをより細かく制御する必要がある場合は、systemdタイマーを使用することをお薦めします。

    次に例を示します:

    */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"
    
  5. cronの出力を確認します。

    sudo tail /var/log/cron
    

    出力には、日付、時間、ユーザーおよびコマンドの実行が表示されます。Oracle Linuxのデフォルトの最小インストールではメール・トランスポート・エージェント(MTA)はインストールされないため、cronデーモンは、crontabで指定されたコマンドからSyslogデーモンに出力を送ります。したがって、crontab出力は、/var/log/cronのログ・ファイルで確認できます。

    Crontabコマンドの構文

    crontabは、crontabが属するユーザーの資格証明の下で実行され、次のようなデフォルトの環境変数が設定されて実行されます。

    • HOME: crontabが実行されるユーザーのホーム・ディレクトリ
    • LOGNAME: crontabが実行するユーザーのユーザー名と同等です。
    • USER: crontabが実行されるユーザーのユーザー名
    • SHELL: システムがコマンドの実行に使用するシェル・バイナリ。この値は、デフォルトで/bin/shに設定されます。
    • PATH: crontabユーティリティで使用可能なパス。この値は、デフォルトで/usr/bin:/binに設定されます。

    時間フィールドを含まないcrontab内の行として指定することで、代替環境変数を設定できます。たとえば、bashシェルを使用し、個人用の.bashrc構成内のすべての変数および設定を定期的にインポートする場合は、次のようにcrontab -eを使用して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
    

    次に例を示します:

    */15 * * * * echo "This 'silent' crontab entry runs every 15 minutes but the 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を参照してください。

Crontabファイルの削除

特定のジョブのみを削除する場合は、crontab -eコマンドを使用して、そのジョブを含む個々の行を編集および削除できます。ただし、すべてのジョブを削除する場合、crontabには迅速かつ効率的なオプションが用意されています。

  1. すべてのcronジョブ・エントリを削除します。

    crontab -r
    

Systemdタイマー

cronジョブと同様に、systemdタイマーでは、特定の時間にコマンドまたはスクリプトを実行できます。ただし、これらのタスクはsystemdによって制御および管理され、時間ベースのアクティブ化をより詳細に制御できます。

  1. 既存のタイマーをリストします。

    systemctl status *timer
    

    systemctlコマンドを終了するには、qを押します。

タイマーを作成

タイマーは、実行する作業を定義するサービス・ユニットと、スケジュールしてトリガーするタイマー・ユニットで構成されます。これらはsystemdサービス・ユニットであるため、システムまたはユーザー・スペースに作成できます。ユーザー空間の利点は、ユーザーがデーモンや自動タスクなどのサービスを管理できることです。

  1. ローカル・ユーザーのsystemdディレクトリを作成します。

    mkdir -p ~/.config/systemd/user
    

    システム・レベルのサービス・ユニットおよびタイマーは、/etc/systemd/systemに入ります。

  2. 現在のユーザーの言語を有効にします。

    loginctl enable-linger $(whoami)
    

    リンガリングとは、ユーザーがセッションからログアウトした後でも、ユーザー・プロセスの実行を継続できるようにするsystemdの機能のことです。

  3. ユーザーのリンガステータスを確認します。

    loginctl user-status $(whoami)
    

    loginctlコマンドを終了するには、qを押します。

  4. タイマーを実行するスクリプトを記述します。

    cat << 'EOF' | tee ~/test.sh > /dev/null 
    #!/bin/bash
    /usr/bin/echo "test from test.service: $(date)" 2>&1 | tee -a /home/oracle/test.log
    EOF
    
  5. スクリプトを実行可能にします。

    chmod +x ~/test.sh
    
  6. サービス・ユニットを作成します。

    cat << EOF | tee ~/.config/systemd/user/test.service > /dev/null
    [Unit]
    Description=Run the test script
    StartLimitIntervalSec=1
    StartLimitBurst=10
       
    [Service]
    Type=oneshot
    ExecStart=/home/oracle/test.sh
    StandardOutput=journal
    SyslogIdentifier=test
    EOF
    

    このサービスは、数秒ごとにこのサービスを実行するため、StartLimitIntervalSecおよびStartLimitBurstが必要です。これらのパラメータの詳細は、man systemd.unitを参照してください。

  7. タイマー・ユニットを作成します。

    cat << EOF | tee ~/.config/systemd/user/test.timer > /dev/null
    [Unit]
    Description=Run test.service every 10 seconds
    
    [Timer]
    OnCalendar=*:*:0/10
    AccuracySec=1
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    EOF
    

    systemdタイマーはリクエスト時に正確には実行されず、1分間のデフォルトの分散で動作するため、AccuracySecパラメータが必要です。

  8. 変更をシステムに認識させます。

    systemctl --user daemon-reload
    
  9. タイマーを有効にして起動します。

    systemctl --user enable --now test.timer
    
  10. タイマーが実行されていることを確認します。

    systemctl --user status test.timer --no-pager
    

    --no-pagerオプションは、エントリをスクロールしたりページングしたりすることなく、完全な出力を出力します。その他のオプションについては、systemctl --helpを参照してください。

  11. bashスクリプトのログ・ファイルを確認します。

    cat ~/test.log
    
  12. systemdジャーナルを確認します。

    journalctl -r -n 10 --user-unit test --no-pager
    

    この出力には、ユーザーの test.service systemdユニットからの出力の最後の10行が表示されます。-rオプションは、仕訳を逆日付順で表示します。

    journalctl -r -n 10 -t test --no-pager
    

    このコマンドは、systemdサービス・ユニットによって実行されるスクリプトによって生成された出力を表示します。-tオプションは、検索する識別子を提供するtest.serviceファイルに定義されているSyslogIdentifierと一致します。journalctlのオプションをさらに表示するには、man journalctlページを参照してください。

  13. タイマーを無効にします。

    systemctl --user disable test.timer
    

    このコマンドは、タイマーが将来自動的に起動するのを防ぎ、非アクティブにします。

  14. タイマーを止める。

    systemctl --user stop test.timer
    

    タイマーが実行中の場合、このコマンドはタイマーの現在の実行を停止します。将来タイマーの再起動を妨げることはありません。

次のステップ

このチュートリアルを完了すると、Oracle Linuxで日付、時刻およびスケジュール・タスクを管理するスキルと能力が実証されます。コマンドには、さらに多くのフラグと機能が示されています。以下のリンクと推奨されるマニュアルページを参照して、知識とスキルを高めてください。

その他の学習リソース

docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。