SystemdのService Management
systemdサービスの起動、有効化、監視およびカスタマイズのためのsystemctlワークフローをカバーします。
Oracle Linuxシステム内のサービスは、systemctl subcommandコマンドによって管理されます。
サブコマンドの例として、enable、disable、stop、start、restart、reload、およびstatusがあります。
詳細は、systemctl(1)マニュアル・ページを参照してください。
サービスの開始と停止
基本的な systemctl startおよび systemctl stopコマンドを示し、状態の変更が持続する方法を説明します。
サービスを開始するには、systemctl startコマンドを使用します:
sudo systemctl start sshd
サービスを停止するには、systemctl stopコマンドを使用します。
sudo systemctl stop sshd
サービスの状態の変化は、システムが同じ状態である間のみ維持されます。
サービスを停止した後、(システムを再起動するなどして)システム状態ターゲットが変化し、それがサービスを実行するように構成された状態への変化であった場合は、サービスが再起動します。同様に、サービスを開始しても、次の再起動後はサービスの開始を有効にしないでください。詳細は、「サービスの有効化と無効化」を参照してください。
サービスの有効化と無効化
リブート後もサービスを起動(または停止したまま)できるように、サービスを有効化、無効化、マスクおよびマスク解除する方法について説明します。
systemctlコマンドを使用して、たとえば次のような、システム起動時に最初からサービスを有効または無効にできます。
sudo systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
enableコマンドは、サービスを起動する最低レベルのシステム状態ターゲットへのシンボリック・リンクを作成することにより、サービスをアクティブ化します。前述の例では、コマンドはmulti-userターゲットへのシンボリック・リンクhttpd.serviceを作成します。
サービスを同時に起動するには、コマンドに--nowオプションを含めます。例:
sudo systemctl enable --now httpdサービスを無効化すると、シンボリック・リンクが削除されます。
sudo systemctl disable httpd
Removed /etc/systemd/system/multi-user.target.wants/httpd.service.
サービスが有効かどうかを確認するには、次の例に示すようにis-enabledサブコマンドを使用します。
systemctl is-enabled httpd
disabled
systemctl is-enabled sshd
enabled
systemctl disableコマンドを実行した後でも、ユーザー・アカウント、スクリプト、およびその他のプロセスによってサービスを開始または停止できます。
ただし、たとえば競合するサービスによって、誤ってサービスを開始できないことを確認する必要がある場合は、次のようにsystemctl maskコマンドを使用します:
sudo systemctl mask httpd
Created symlink from '/etc/systemd/system/multi-user.target.wants/httpd.service' to '/dev/null'
maskコマンドは、サービス参照を/dev/nullに設定します。マスクされたサービスを開始しようとすると、次の例に示すようにエラーが返されます。
sudo systemctl start httpd
Failed to start httpd.service: Unit is masked.
サービス参照を一致するサービス・ユニット構成ファイルに再リンクするには、systemctl unmaskコマンドを使用します:
sudo systemctl unmask httpd
詳細は、systemctl(1)マニュアル・ページを参照してください。
サービスのステータスの表示
サービスの健全性および制御グループをチェックするための systemctl is-activeおよび statusコマンドの詳細を示します。
サービスが実行中かどうかを確認するには、is-activeサブコマンドを使用します。次の例では、出力はアクティブまたは非アクティブになります。
systemctl is-active httpd
active
systemctl is-active sshd
inactive
statusサブコマンドは、サービスを実装する制御グループ(CGroup)のタスクを表示するツリーなど、サービスのステータスの詳細サマリーを提供します:
systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since ...
Docs: man:httpd.service(8)
Main PID: 11832 (httpd)
Status: "Started, listening on: port 80"
Tasks: 213 (limit: 26213)
Memory: 32.5M
CGroup: /system.slice/httpd.service
├─11832 /usr/sbin/httpd -DFOREGROUND
├─11833 /usr/sbin/httpd -DFOREGROUND
├─11834 /usr/sbin/httpd -DFOREGROUND
├─11835 /usr/sbin/httpd -DFOREGROUND
└─11836 /usr/sbin/httpd -DFOREGROUND
Jul 17 00:14:32 Unknown systemd[1]: Starting The Apache HTTP Server...
Jul 17 00:14:32 Unknown httpd[11832]: Server configured, listening on: port 80
Jul 17 00:14:32 Unknown systemd[1]: Started The Apache HTTP Server.
cgroupは相互にバインドされているプロセスのコレクションであり、システム・リソースへのアクセスを制御できます。この例では、httpdサービスのcgroupはhttpd.serviceであり、systemスライスにあります。
スライスはシステム上のcgroupsを複数のカテゴリに分割します。スライスとcgroup階層を表示するには、systemd-cglsコマンドを使用します:
systemd-cgls
Control group /:
-.slice
├─user.slice
│ └─user-1000.slice
│ ├─user@1000.service
│ │ └─init.scope
│ │ ├─6488 /usr/lib/systemd/systemd --user
│ │ └─6492 (sd-pam)
│ └─session-7.scope
│ ├─6484 sshd: root [priv]
│ ├─6498 sshd: root@pts/0
│ ├─6499 -bash
│ ├─6524 sudo systemd-cgls
│ ├─6526 systemd-cgls
│ └─6527 less
├─init.scope
│ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 16
└─system.slice
├─rngd.service
│ └─1266 /sbin/rngd -f --fill-watermark=0
├─irqbalance.service
│ └─1247 /usr/sbin/irqbalance --foreground
├─libstoragemgmt.service
│ └─1201 /usr/bin/lsmd -d
├─systemd-udevd.service
│ └─1060 /usr/lib/systemd/systemd-udevd
├─polkit.service
│ └─1241 /usr/lib/polkit-1/polkitd --no-debug
├─chronyd.service
│ └─1249 /usr/sbin/chronyd
├─auditd.service
│ ├─1152 /sbin/auditd
│ └─1154 /usr/sbin/sedispatch
├─tuned.service
│ └─1382 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
├─systemd-journald.service
│ └─1027 /usr/lib/systemd/systemd-journald
├─atd.service
│ └─1812 /usr/sbin/atd -f
├─sshd.service
│ └─1781 /usr/sbin/sshd
system.sliceには、サービスおよび別のシステムのプロセスが含まれています。user.sliceには、scopesと呼ばれる一時cgroupで実行されるユーザー・プロセスが含まれています。
この例では、ID 1000のユーザーのプロセスはスライス/user.slice/user-1000.sliceのスコープsession-7.scopeで実行されています。
systemctlコマンドを使用して、サービスとスコープのcgroup内のプロセスで使用できるCPU、I/O、メモリー、およびその他リソースを制限できます。「システム・リソースへのアクセスの制御」を参照してください。
詳細は、systemctl(1)およびsystemd-cgls(1)の各マニュアル・ページを参照してください。「Systemdを使用した制御グループの管理」も参照してください。
システム・リソースへのアクセスの制御
systemctl set-propertyおよび systemd-runを使用して、CPUおよびメモリーの制限をサービスおよびスコープに割り当てる方法を示します。
systemctlコマンドを使用して、次のようにシステム・リソースへのcgroupのアクセスを制御します。
sudo systemctl [--runtime] set-property httpd CPUShares=512 MemoryLimit=1G
CPUShareはCPUリソースへのアクセスを制御します。デフォルト値は1024であり、値を512にすると、cgroupのプロセスのCPU時間へのアクセスが半分になります。同様に、MemoryLimitはcgroupで使用可能なメモリーの最大量を制御します。
.service拡張子をサービス名に指定する必要はありません。
--runtimeオプションを指定すると、システムを再起動したときに設定が維持されません。
または、サービスのリソース設定は、/usr/lib/systemd/systemのサービスの構成ファイルにある[Service]の見出しで変更できます。ファイルを編集すると、systemdがその構成ファイルをリロードし、サービスを再開します。
sudo systemctl daemon-reload
sudo systemctl restart service
スコープ内で一般的なコマンドを実行し、systemctlを使用して、これらの一時cgroupsのシステム・リソースに対する持つアクセスを制御できます。スコープ内でコマンドを実行するには、systemd-runコマンドを使用します。
sudo systemd-run --scope --unit=group_name.scope [--slice=slice_name]
デフォルトのsystemスライスでグループを作成しない場合は、別のスライスまたは新しいスライスの名前を指定できます。次の例では、myslice.sliceのmymon.scopeでmymonitorというコマンドを実行します。
sudo systemd-run --scope --unit=mymon.scope --slice=myslice mymonitor
Running as unit mymon.scope.
--scopeオプションを指定しない場合は、制御グループがスコープではなく、サービスとして作成されます。
次に、systemctlを使用して、サービスと同じように、スコープがシステム・リソースに対して持つアクセスを制御します。ただし、サービスとは異なり、次のように.scope拡張子を指定する必要があります。
sudo systemctl --runtime set-property mymon.scope CPUShares=256
詳細は、Systemdを使用した制御グループの管理およびsystemctl(1)、systemd-cgls(1)およびsystemd.resource-control(5)のマニュアル・ページに関する項を参照してください。
ユーザーベースのsystemdサービスの作成
システム全体のsystemdファイルに加えて、systemdを使用すると、ルート・アクセスおよび権限を必要とせずにユーザー・レベルから実行できるユーザーベースのサービスを作成できます。これらのユーザーベースのサービスは、ユーザーの制御下にあり、システム・サービスとは独立して構成できます。
ユーザーベースのsystemdサービスのいくつかの特徴を次に示します。
- ユーザーベースの
systemdサービスは、特定のユーザー・アカウントにリンクされます。 - これらは、
$HOME/.config/systemd/user/内の関連するユーザーのホーム・ディレクトリの下に作成されます。 - これらのサービスを有効にすると、関連付けられたユーザーがログインしたときにサービスが開始されます。この動作は、システムのブート時に開始する有効な
systemdサービスの動作とは異なります。
この機能は、Podmanコンテナ・サービスの作成時に特に役立ちます。Podmanの詳細は、Oracle Linux: Podmanユーザーズ・ガイドに関する項を参照してください。
ユーザーベースのサービスを作成するには:
systemdサービス・ユニット・ファイルの更新
パッケージ・ユニット・ファイルをオーバーライドし、/etc/systemd/systemの下にドロップイン・スニペットを作成する方法について説明します。
systemdサービスの構成を変更するには、.service、.target、.mountおよび.socket拡張子を持つファイルを/usr/lib/systemd/systemから/etc/systemd/systemにコピーします。
ファイルをコピーしたら、/etc/systemd/systemでバージョンを編集できます。
/etc/systemd/systemのファイルは、/usr/lib/systemd/systemのバージョンより優先されます。/usr/lib/systemd/systemのファイルに対応するパッケージを更新しても、/etc/systemd/systemのファイルは上書きされない。
特定のサービスのデフォルトのsystemd構成に戻すには、/etc/systemd/systemでコピーの名前を変更するか削除します。
サービスの構成を変更するもう1つの方法は、ドロップイン・ファイルを作成することです。この方法では、ユニットの特定のパラメータを変更しながら、元のユニットを保持できます。
/etc/systemd/system/unit_name.d/に、unit_name.dディレクトリが既存の単位であるドロップイン・ファイルを作成し、ドロップイン・ファイルに.confファイル拡張子を指定します。
例: /etc/systemd/system/unit_name.d/name_of_drop-in.conf。systemdは、.confファイルを読み取り、設定を元の単位に適用します。
次の項では、システムで編集およびカスタマイズするサービス・ユニット・ファイルの様々な部分について説明します。
サービス・ユニット・ファイルについて
サービスは、対応するサービス・ユニット・ファイルに基づいて実行されます。サービス・ユニット・ファイルには通常次のセクションが含まれています。各セクションには、特定のサービスの実行方法を決定するそれぞれの定義済オプションが含まれます。
-
[Unit] -
サービスに関する情報が含まれています。
[UnitType]:-
ファイルのユニット・タイプに固有のオプションが含まれています。たとえば、サービス・ユニット・ファイルでは、このセクションのタイトルは
[Service]で、ExecStartやStandardOutputなどのサービス・タイプのユニットに固有のオプションが含まれています。そのタイプに固有のオプションを提供するユニット・タイプにのみ、このようなセクションがあります。
-
[Install] -
特定のユニットのインストール情報が含まれています。このセクションの情報は、systemctl enableおよびsystemctl disableコマンドで使用されます。
サービス・ユニット・ファイルには、サービスに対する次の構成が含まれている場合があります。
[Unit]
Description=A test service used to develop a service unit file template
[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/lib/systemd/helloworld.sh
[Install]
WantedBy=default.target
「サービス・ユニット・ファイルで構成可能なオプション」では、各セクションで使用可能な一般的に使用される構成済オプションの一部について説明します。完全なリストは、systemd.service(5)およびsystemd.unit(5)の各マニュアル・ページでも入手できます。
サービス・ユニット・ファイルの構成可能なオプション
次の各リストでは、サービス・ユニット・ファイルの個別のセクションについて説明します。
[Unit]セクションのオプションの説明
次のリストは、サービス・ユニット・ファイルの[Unit]セクションで使用可能な、一般的に使用される構成可能オプションの一般的な概要を示しています。
-
Description -
サービスに関する情報を提供します。この情報は、ユニットで
systemctl statusコマンドを実行すると表示されます。 -
Documentation -
このユニットまたはその構成のドキュメントを参照するURIのスペース区切りリストが含まれています。
-
After -
オプションに一覧表示されているユニットの起動完了後にのみ実行されるようにユニットを構成します。
次の例では、ファイルvar3.
serviceに次のエントリがある場合、それはユニットvar1.serviceおよびvar2.serviceが起動後にのみ開始します。After=var1.service var2.service -
Requires -
他のユニットに対して要件の依存関係を持つようにユニットを構成します。ユニットがアクティブになっている場合、その
Requiresオプションにリストされているユニットもアクティブになります。 -
Wants -
厳密でないバージョンの
Requiresオプション。たとえば、Wantsオプションにリストされているユニットのいずれかが起動に失敗した場合でも、特定のユニットをアクティブ化できます。
[Service]セクションのオプションの説明
次のリストは、サービス・ユニット・ファイルの[Service]セクションで使用可能な、一般的に使用される構成可能オプションの概要を示しています。
-
Type -
サービス・ユニットのプロセス起動タイプを構成します。
デフォルトでは、このパラメータの値は
simpleです。これは、サービスのメイン・プロセスがExecStartパラメータによって起動されることを示します。通常、サービスのタイプが
simpleの場合、この定義はファイルから省略できます。 -
StandardOutput -
サービスのイベントのログ記録方法を構成します。たとえば、サービス・ユニット・ファイルに次のエントリがあるとします。
StandardOutput=journalこの例では、値
journalは、イベントがジャーナルに記録されることを示し、journalctlコマンドを使用して表示できます。 -
ExecStart -
サービスを開始するフル・パスとコマンドを指定します(たとえば、
/usr/bin/npm start)。 -
ExecStop -
ExecStartを介して開始されたサービスを停止するために実行するコマンドを指定します。 -
ExecReload -
サービス内の構成のリロードをトリガーするために実行するコマンドを指定します。
-
Restart -
サービス・プロセスが終了したか、停止したか、またはタイムアウトに達したときにサービスを再起動するかどうかを構成します。
ノート
このオプションは、systemctl stopやsystemctl restartなどのsystemd操作によってプロセスが正しく停止された場合、適用されない。このような場合、この構成オプションによってサービスは再起動されません。 -
RemainAfterExit -
すべてのプロセスが終了した場合でもサービスがアクティブであるとみなされるかどうかを構成するブール値です。デフォルト値は
noです。
[Install]セクションのオプションの説明
次のリストは、サービス・ユニット・ファイルの[Install]セクションで使用可能な、一般的に使用される構成可能オプションの概要を示しています。
-
Alias -
ユニットの名前をスペースで区切ったリスト。
インストール時に、
systemctl enableはこれらの名前からユニット・ファイル名へのシンボリック・リンクを作成します。別名が有効になるのは、ユニットが有効な場合のみです。
-
RequiredBy -
サービスが他のユニットで必要になるように構成します。
たとえば、ユニット・ファイル
var1.serviceに次の構成が追加されているとします。RequiredBy=var2.service var3.servicevar1.serviceが有効な場合、var2.serviceとvar3.serviceの両方にvar1.serviceに対するRequires依存関係が付与されます。この依存関係は、各依存サービス(var2.serviceおよびvar3.service)の.requiresフォルダに作成されるシンボリック・リンクによって定義され、このリンクはvar1.serviceシステム・ユニット・ファイルを示します。 -
WantedBy -
ファイルを編集しているサービスに対する
wants依存関係を付与するユニットのリストを指定します。たとえば、ユニット・ファイル
var1.serviceに次の構成が追加されているとします。WantedBy=var2.service var3.servicevar1.serviceが有効な場合、var2.serviceとvar3.serviceの両方にvar1.serviceに対するWants依存関係が付与されます。この依存関係は、var1.serviceのシステム・ユニット・ファイルを指している各依存サービス(var2.serviceおよびvar3.service)の.wantsフォルダに作成されるシンボリック・リンクによって定義されます、 -
Also -
ユニットがインストールまたは削除されたときにインストールまたは削除する追加ユニットをリストします。
-
DefaultInstance -
DefaultInstanceオプションは、テンプレート・ユニット・ファイルにのみ適用されます。テンプレート・ユニット・ファイルを使用すると、1つの構成ファイルから複数のユニットを作成できます。
DefaultInstanceオプションは、明示的にインスタンスを設定せずにテンプレートを有効にした場合、ユニットを有効にするインスタンスを指定します。
ユニットドロップインファイルの作成
systemctl editコマンドを使用して、既存のsystemdユニットのsystemdユニット・ドロップインまたはユニット・ファイルを自動的に生成できます。ドロップイン・ファイルを使用して、ユニットの基本構成をオーバーライドしたり、ユニット・ファイルの要件を拡張したりできます。