ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で使用できます。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了したら、これらの値をクラウド環境に固有の値に置き換えてください。
Oracle Linuxでのシステム時間の管理およびタスクのスケジュール
イントロダクション
Oracle Linuxは、日付と時刻を操作するためのいくつかの方法をユーザーに提供します。これらは手動で変更できますが、chronyなどの Network Time Protocol (NTP)を実装するサービスを構成するのが一般的です。このようにして、システム時間は正しいままになり、cron
またはsystemd timers
を使用するタスクはスケジュールどおりに実行されます。
目的
このチュートリアルでは、次のことを学習します。
date
、hwclock
およびtimedatectl
を使用して、ターミナルからシステム時間を管理します- chronyサービスを実行して有効にする
- cronおよびsystemd timersを使用してタスクをスケジュールする
前提条件
-
単一のOracle Linuxシステムの最少数
-
各システムには、次を使用してOracle Linuxがインストールおよび構成されている必要があります。
- sudoアクセス権を持つroot以外のユーザー・アカウント
- インターネットへのアクセス
Oracle Linuxのデプロイ
ノート:独自のテナンシで実行している場合は、演習環境をデプロイする前に、linux-virt-labs
GitHubプロジェクトREADME.mdを読み、前提条件を完了してください。
-
Lunaデスクトップでターミナルを開きます。
-
linux-virt-labs
GitHubプロジェクトをクローニングします。git clone https://github.com/oracle-devrel/linux-virt-labs.git
-
作業ディレクトリに変更する。
cd linux-virt-labs/ol
-
必要なコレクションをインストールします。
ansible-galaxy collection install -r requirements.yml
-
演習環境をデプロイします。
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
です。このコマンドは、date
とhwclock
を組み合せて、時間の設定時にシステムとRTCの両方を更新します。Oracle Linuxなどの最新のsystemdベースのLinuxディストリビューションでは、timedatectl
を使用することをお薦めします。
システムクロックの表示と設定
-
端末を開き、SSH経由でol-node-01インスタンスに接続します。
ssh oracle@<ip_address_of_instance>
-
現在のシステム時間と日付を取得します。
date
出力には、システムの日付、時刻、およびタイムゾーンがデフォルトの形式で表示されます。
date
コマンドの多数の引数を使用して、出力の形式を変更できます。これらの引数は、異なる日付と時刻をスクリプト化または計算する場合に便利です。詳細は、date --help
を実行するか、man date
を使用してマニュアル・ページを参照してください。 -
システムの時間と日付を調整します。
sudo date -s "1 JAN 1970 16:00:00"
-
書式制御引数を使用して、書式を簡略化します。
sudo date +%Y%m%d -s "20250203"
時間を指定しなかったため、時間部分はすべてのゼロ(午前0時)にデフォルト設定されます。
-
システム時間を設定します。
sudo date +%T -s "14:08:14"
date
コマンドを再度実行すると、入力した内容に従って時間が表示されます。
ハードウェアクロックの表示と設定
-
現在のハードウェアクロック(RTC)を読み取ります。
sudo hwclock --show
-
ハードウェアクロックに基づいてシステムクロックを設定します。
sudo hwclock -s
このコマンドでは、
-w
関数を渡すことで、クロックを反対方向に設定できます。hwclock --help
を実行するか、マニュアル・ページman hwclock
を表示して、追加のファンクションおよびオプションを確認します。
Systemdを使用した日時
-
現在の日付と時刻を取得します。
timedatectl
無料の演習環境での出力は、NTPサービスがアクティブであることを示しています。
timedatectl
を使用して日付と時間の設定を手動で調整するには、最初に無効にする必要があります。 -
NTP同期を無効にします。
sudo timedatectl set-ntp no
-
日付と時間を設定します。
sudo timedatectl set-time '2014-09-23 14:10:40'
-
日付と時間を確認します。
date
-
タイムゾーンの一覧を取得します。
timedatectl list-timezones
timedatectl
コマンドを終了するには、q
を押します。 -
タイムゾーンの設定。
sudo timedatectl set-timezone 'America/Chicago'
-
新しいタイム・ゾーンを確認します。
timedatectl
-
タイム・ゾーンを協定世界時(UTC)に戻します。
sudo timedatectl set-timezone 'UTC'
-
NTP同期を有効にします。
sudo timedatectl set-ntp yes
しばらくすると同期が発生し、クロックはタイムゾーン・セットに基づいて現在の日時に戻ります。
Chronyの使用
chronyは、ネットワーク上でタイムキーピングを正確に維持するためにNTPを実装するOracle Linuxの機能で、chronyd
とchronyc
の2つのコンポーネントで構成されます。chronyd
は、起動時に有効化および起動できるサービス・デーモンであり、chronyc
は、chronyd
のパフォーマンスを監視してランタイム・パラメータを変更するために使用されるコマンドライン・ユーティリティです。
-
chronyがインストールされているかどうかを確認します。
dnf list chrony
インストールされていない場合は、
sudo dnf install -y chrony
を使用してインストールできます。 -
サービスデーモンのステータスを確認します。
sudo systemctl status chronyd
非アクティブな場合は、
sudo systemctl enable --now chronyd
を使用してサービスを有効化および開始します。systemctl
コマンドを終了するには、q
を押します。 -
システムクロックのパフォーマンスに関する情報を取得します。
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
を使用してマニュアル・ページを確認してください。 -
システムで使用するソースのリストを取得します。
chronyc -n sources
-v
オプションを使用すると、表示される各列の列の説明が表示されます。
タスクのスケジュール
Oracle Linuxには、タスクをスケジュールするためのいくつかの方法があり、これらのタスクまたはジョブはシステム・レベルまたはユーザー・レベルで実行できます。cronはこれらの方法の中で最もよく知られていますが、systemdはカレンダーと単調な時間によるスケジューリングの観点から、より柔軟なタイマーを導入し、より広く使用されるようになっています。現在のOracle Linuxディストリビューションには、両方の組合せがあります。
Cronの使用
-
システム・レベルのcronジョブを確認します。
sudo ls -al /etc/cron*
この出力には、時間、週、月など、事前に決定されたスケジュールで選択タスクを実行する実行可能スクリプトを含む複数のディレクトリが用意されています。
/etc/cron.d
ディレクトリも存在し、パッケージではシステム/etc/crontab
を変更せずにcrontabスニペットを配置できます。 -
システム・レベルのcronジョブのリストを取得します。
sudo crontab -l
この出力は、root用のcrontabがないことを示しています。
sudo
を指定せずに同じコマンドを実行すると、同じ出力がローカル・ユーザー・アカウントに対して提供されます。 -
ユーザー・レベルのcronジョブを作成します。
(crontab -l 2>/dev/null; echo '* * * * * date >> /home/oracle/test') | crontab -
最初のコマンドは no crontabメッセージを回避します。これは最初に入力されたジョブであるため、2番目のコマンドは1分ごとに実行されるジョブを作成します。
-
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"
-
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
には迅速かつ効率的なオプションが用意されています。
-
すべてのcronジョブ・エントリを削除します。
crontab -r
Systemdタイマー
cronジョブと同様に、systemdタイマーでは、特定の時間にコマンドまたはスクリプトを実行できます。ただし、これらのタスクはsystemdによって制御および管理され、時間ベースのアクティブ化をより詳細に制御できます。
-
既存のタイマーをリストします。
systemctl status *timer
systemctl
コマンドを終了するには、q
を押します。
タイマーを作成
タイマーは、実行する作業を定義するサービス・ユニットと、スケジュールしてトリガーするタイマー・ユニットで構成されます。これらはsystemdサービス・ユニットであるため、システムまたはユーザー・スペースに作成できます。ユーザー空間の利点は、ユーザーがデーモンや自動タスクなどのサービスを管理できることです。
-
ローカル・ユーザーのsystemdディレクトリを作成します。
mkdir -p ~/.config/systemd/user
システム・レベルのサービス・ユニットおよびタイマーは、
/etc/systemd/system
に入ります。 -
現在のユーザーの言語を有効にします。
loginctl enable-linger $(whoami)
リンガリングとは、ユーザーがセッションからログアウトした後でも、ユーザー・プロセスの実行を継続できるようにするsystemdの機能のことです。
-
ユーザーのリンガステータスを確認します。
loginctl user-status $(whoami)
loginctlコマンドを終了するには、
q
を押します。 -
タイマーを実行するスクリプトを記述します。
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
-
スクリプトを実行可能にします。
chmod +x ~/test.sh
-
サービス・ユニットを作成します。
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
を参照してください。 -
タイマー・ユニットを作成します。
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
パラメータが必要です。 -
変更をシステムに認識させます。
systemctl --user daemon-reload
-
タイマーを有効にして起動します。
systemctl --user enable --now test.timer
-
タイマーが実行されていることを確認します。
systemctl --user status test.timer --no-pager
--no-pager
オプションは、エントリをスクロールしたりページングしたりすることなく、完全な出力を出力します。その他のオプションについては、systemctl --help
を参照してください。 -
bashスクリプトのログ・ファイルを確認します。
cat ~/test.log
-
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
ページを参照してください。 -
タイマーを無効にします。
systemctl --user disable test.timer
このコマンドは、タイマーが将来自動的に起動するのを防ぎ、非アクティブにします。
-
タイマーを止める。
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を参照してください。
Manage System Time and Schedule Tasks on Oracle Linux
F49761-05