SystemdのService Management

systemdサービスの起動、有効化、監視およびカスタマイズのためのsystemctlワークフローをカバーします。

Oracle Linuxシステム内のサービスは、systemctl subcommandコマンドによって管理されます。

サブコマンドの例として、enabledisablestopstartrestartreload、および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サービスのcgrouphttpd.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時間へのアクセスが半分になります。同様に、MemoryLimitcgroupで使用可能なメモリーの最大量を制御します。

ノート

.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.slicemymon.scopemymonitorというコマンドを実行します。

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ユーザーズ・ガイドに関する項を参照してください。

ユーザーベースのサービスを作成するには:

  1. $HOME/.config/systemd/userディレクトリにサービスのユニット・ファイルを作成します。次に例を示します:
    touch $HOME/.config/systemd/user/myservice.service
  2. ユニット・ファイルを開き、使用するオプションの値(DescriptionExecStartWantedByなど)を指定します。
    詳細は、「サービス・ユニット・ファイルの構成可能なオプション」およびsystemd.service(5)およびsystemd.unit(5)の各マニュアル・ページを参照してください。
  3. ログイン時にサービスを自動的に開始できるようにします。
    systemctl --user enable myservice.service
    ノート

    ログアウトすると、rootユーザーがユーザーに対して実行を続行するプロセスを有効にしていないかぎり、サービスは停止されます。

    詳細は、https://docs.oracle.com/en/learn/ol-systemd/を参照してください。

  4. サービスを起動します。
    systemctl --user start myservice.service
  5. サービスが稼働していることを確認します。
    systemctl --user status myservice.service

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.confsystemdは、.confファイルを読み取り、設定を元の単位に適用します。

次の項では、システムで編集およびカスタマイズするサービス・ユニット・ファイルの様々な部分について説明します。

サービス・ユニット・ファイルについて

サービスは、対応するサービス・ユニット・ファイルに基づいて実行されます。サービス・ユニット・ファイルには通常次のセクションが含まれています。各セクションには、特定のサービスの実行方法を決定するそれぞれの定義済オプションが含まれます。

[Unit]

サービスに関する情報が含まれています。

[UnitType]:

ファイルのユニット・タイプに固有のオプションが含まれています。たとえば、サービス・ユニット・ファイルでは、このセクションのタイトルは[Service]で、ExecStartStandardOutputなどのサービス・タイプのユニットに固有のオプションが含まれています。

そのタイプに固有のオプションを提供するユニット・タイプにのみ、このようなセクションがあります。

[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 stopsystemctl restartなどのsystemd操作によってプロセスが正しく停止された場合、適用されない。このような場合、この構成オプションによってサービスは再起動されません。
RemainAfterExit

すべてのプロセスが終了した場合でもサービスがアクティブであるとみなされるかどうかを構成するブール値です。デフォルト値はnoです。

[Install]セクションのオプションの説明

次のリストは、サービス・ユニット・ファイルの[Install]セクションで使用可能な、一般的に使用される構成可能オプションの概要を示しています。

Alias

ユニットの名前をスペースで区切ったリスト。

インストール時に、systemctl enableはこれらの名前からユニット・ファイル名へのシンボリック・リンクを作成します。

別名が有効になるのは、ユニットが有効な場合のみです。

RequiredBy

サービスが他のユニットで必要になるように構成します。

たとえば、ユニット・ファイルvar1.serviceに次の構成が追加されているとします。

RequiredBy=var2.service var3.service

var1.serviceが有効な場合、var2.servicevar3.serviceの両方にvar1.serviceに対するRequires依存関係が付与されます。この依存関係は、各依存サービス(var2.serviceおよびvar3.service)の.requiresフォルダに作成されるシンボリック・リンクによって定義され、このリンクはvar1.serviceシステム・ユニット・ファイルを示します。

WantedBy

ファイルを編集しているサービスに対するwants依存関係を付与するユニットのリストを指定します。

たとえば、ユニット・ファイルvar1.serviceに次の構成が追加されているとします。

WantedBy=var2.service var3.service

var1.serviceが有効な場合、var2.service var3.serviceの両方にvar1.serviceに対するWants依存関係が付与されます。この依存関係は、var1.serviceのシステム・ユニット・ファイルを指している各依存サービス(var2.serviceおよびvar3.service)の.wantsフォルダに作成されるシンボリック・リンクによって定義されます、

Also

ユニットがインストールまたは削除されたときにインストールまたは削除する追加ユニットをリストします。

DefaultInstance

DefaultInstanceオプションは、テンプレート・ユニット・ファイルにのみ適用されます。

テンプレート・ユニット・ファイルを使用すると、1つの構成ファイルから複数のユニットを作成できます。DefaultInstanceオプションは、明示的にインスタンスを設定せずにテンプレートを有効にした場合、ユニットを有効にするインスタンスを指定します。

ユニットドロップインファイルの作成

systemctl editコマンドを使用して、既存のsystemdユニットのsystemdユニット・ドロップインまたはユニット・ファイルを自動的に生成できます。ドロップイン・ファイルを使用して、ユニットの基本構成をオーバーライドしたり、ユニット・ファイルの要件を拡張したりできます。

  1. systemctl edit <unit>コマンドを実行してsystemdドロップイン・ファイルを自動的に生成し、システムのデフォルト・エディタでファイルを開きます。

    たとえば、cockpit.socketユニットを編集して、Cockpit Webコンソールがリスニングするポートを変更するには、次のようにします。

    sudo systemctl edit cockpit.socket --drop-in=listen.conf

    --drop-inオプションを使用すると、ドロップイン・ファイルに使用されるファイル名を指定できます。このオプションを指定しない場合、デフォルトのファイル名はoverride.confに設定されます。

    システム・テキスト・エディタが開き、行を追加してデフォルト構成をオーバーライドできます。

    [Socket]
    ListenStream=
    ListenStream=443
    ノート

    Cockpitのデフォルト・リスナー・ポートを変更する場合は、systemdの外部でさらに構成する必要があります。たとえば、SELinuxコンテキストおよびファイアウォール構成の変更が必要になる場合があります。
  2. ドロップイン・ファイルを保存するか、終了します。
    変更内容をドロップイン・ファイルに保存すると、ファイルは自動的に/etc/systemd/system/<unit>.d/<drop-in.file>にインストールされます。変更を保存せずにエディタを終了すると、ファイルは作成されず、これ以上の更新は必要ありません。
  3. systemdデーモン構成を再ロードします。
    sudo systemctl daemon-reload
  4. 更新したsystemdユニットを再起動します。

    たとえば、この例で使用されているcockpit.socketを再起動するには、次を実行します:

    sudo systemctl restart cockpit.socket