目次にジャンプページナビゲーションにジャンプ: 前のページ[アクセスキーp]/次のページ[アクセスキーn]
documentation.suse.com / systemdの基本

systemdの基本

発行日: 12/12/2024
概要

systemdは、システム設定とサービスを管理する場合に使用します。systemdは、タスクを「ユニット」と呼ばれるコンポーネントに編成し、ユニットのグループを「ターゲット」に編成します。

目的

systemdの基本について習得します。これには、サービス管理、依存関係の追跡、ログ記録、リソース管理、ソケットの有効化、システム制御などの重要な機能が含まれます。

所要時間

理解に20分ほどを要します。

要件
  • Linuxコマンドの基本的な理解

  • Linuxのプロセス、デーモン、およびコントロールグループの基本的な理解

1 systemdとは

systemdは、Linuxオペレーティングシステムのシステムおよびサービスマネージャです。主要なLinuxディストリビューションでデフォルトの初期化システムです。systemdは、ユーザが直接開始するのではなく、/sbin/initを介してインストールされ、初期ブート中に起動されます。systemdは、ブート時に最初のプロセス(PID 1)として実行されたときにユーザスペースサービスを起動および維持するinitシステムとして機能します。PID 1はinitと呼ばれ、最初に作成されるLinuxユーザモードプロセスです。その実行はシステムのシャットダウンまで継続します。

systemdはPID 1を所有し、カーネルによって直接起動されます。他のすべてのプログラムは、systemdまたはそのいずれかの子プロセスによって直接起動します。systemdは、ホストのファイルシステムをマウントし、一時ファイルを管理します。SysV initスクリプトとの下位互換性があります。SysVは、systemdよりも以前の初期化システムです。

systemdでは、ユニットとは、システムが操作および管理方法を認識しているリソースのことです。これは、systemdツールで使用されるプライマリオブジェクトです。これらのリソースは、設定ファイルであるユニットファイルで定義します。

systemctlは、initシステムを制御する中央管理ツールです。systemdシステムおよびサービスマネージャの状態を調べ、制御するために使用されます。

systemdでいうターゲットとは、システムのブート中に同期ポイントとして機能する関連ユニットのグループです。ターゲットのユニットファイルの拡張子は.targetです。ターゲットのユニットは、依存関係の連鎖を通じてさまざまなsystemdユニットをまとめたものです。

トラブルシューティングにはjournalctlを使用できます。これを使用して、systemdジャーナルからのログメッセージを問い合わせたり、表示したりします。

systemdの詳細については、https://systemd.ioおよびman 1 systemdを参照してください。

2 systemdのブートプロセスについて

ブートプロセスの最初の手順は、LinuxオペレーティングシステムのメインコンポーネントであるLinuxカーネルをロードすることです。ロードされると、カーネルはハードウェアを初期化し、システムで実行される最初のプロセスであるsystemdプロセスを開始します。

2.1 Linuxのブートプロセス

Linuxのブートプロセスは、オペレーティングシステムの起動の初期ステージです。これは、オペレーティングシステムがメモリをロードし、コンポーネントを初期化してユーザアプリケーションの実行を準備するプロセスです。

Linuxのブートプロセスは次の4つの主要なステージに分けられます。

ステージ1: BIOS

コンピュータの電源をオンにすると、コンピュータはBIOS (Basic Input/Output System)を起動し、POST (Power On Self Test)を実行します。POSTは、ハードディスク、SSD、キーボード、RAM、USBポートなどのコンポーネントやその他のハードウェアの機能を検査する整合性チェックです。ハードウェアが期待どおりに動作する場合、ブートプロセスは次のステージに進みます。

ステージ2: ブートローダ

POSTが完了すると、BIOSはMBR (マスターブートレコード)に保存されているブートローダプログラムを検索してロードします。MBRは512バイトのコードで、通常はハードドライブのアーキテクチャに応じて/dev/sdaまたは/dev/hdaに配置されています。MBRは、LinuxのライブUSBまたはDVDインストール上に配置することもできます。BIOSは、このMBRコードをロードして実行します。

Linuxには、主要なブートローダとしてLILO、GRUB、およびGRUB2の3つがあります。GRUB2 (Grand Unified Bootloader)ブートローダは、最新のLinuxディストリビューションにおける最新のプライマリブートローダです。GRUB2の設定ファイルは/boot/grub2/grub2.cfgにあります。BIOSは、GRUB2ブートローダを見つけると、GRUB2を実行してメインメモリ(RAM)にロードします。

ステージ3: Linuxカーネルの初期化

Linuxカーネルは、オペレーティングシステムの心臓部です。Linuxシステムでは、カーネルはハードウェアとのインタフェースとして機能し、メモリ管理を制御し、プロセスを管理します。ブートローダは、選択したLinuxカーネルをロードします。カーネルは、圧縮されたバージョンから自己抽出され、ルートファイルシステムをマウントします。その後、/sbin/initプログラムを実行します。

ステージ4: systemd

カーネルは、Linuxオペレーティングシステムのシステムおよびサービスマネージャであるsystemdをロードします。続いて、systemdが他のすべての初期化プロセスを実行します。

2.2 systemdによるブートプロセス

カーネルがsystemdをロードすると、systemdが処理を引き継ぎ、システムを稼働させるために必要な他のシステムサービスを開始します。これには、ネットワーキングサービス、ログインマネージャなどのサービスが含まれます。

ブートプロセスは、特定のターゲットユニットの実行順に並列化されます。systemdは、/etc/systemd/system/default.targetファイルを使用して、Linuxシステムをブートするターゲットを判断します。このファイルは、グラフィカルログインマネージャをブートするgraphical.targetへのリンクになっています。systemdは、default.targetの依存関係であるすべてのターゲットユニットを有効にし、さらにこれらの依存関係の依存関係すべてを再帰的に有効にします。すべてのサービスが開始されると、システムの使用準備が整い、ログインマネージャが表示されます。これで、システムにログインして、システムの使用を開始できるようになります。

2.3 systemd-analyzeコマンドによるシステムブートプロセスのパフォーマンスの分析

systemd-analyzeコマンドを使用して、システムブートプロセスのパフォーマンスを分析します。また、システムおよびサービスマネージャから他の状態情報やトレース情報を取得することもできます。このコマンドを使用して、ユニットファイルが正しいことを確認したり、システムマネージャの高度なデバッグに役立つ特別な機能にアクセスしたりします。

次に例を示します。

システムのブートにかかる時間の表示
> systemd-analyze time
Startup finished in 3.404s (kernel) + 2.415s (initrd) + 13.125s (userspace) = 18.945s
graphical.target reached after 13.117s in userspace
ブートプロセスの概要の取得(開始されているサービスや、各サービスの開始にかかる時間など)
> systemd-analyze critical-chain
  The time when unit became active or started is printed after the "@" character.
  The time the unit took to start is printed after the "+" character.

  graphical.target @13.117s
  └─multi-user.target @13.117s
    └─getty.target @13.117s
      └─getty@tty1.service @13.116s
        └─plymouth-quit-wait.service @10.775s +2.338s
          └─systemd-user-sessions.service @10.769s +3ms
            └─remote-fs.target @10.764s
              └─iscsi.service @10.747s +16ms
                └─network-online.target @10.744s
                  └─NetworkManager-wait-online.service @1.547s +9.197s
                    └─NetworkManager.service @1.507s +37ms
                      └─network-pre.target @1.504s
                        └─wpa_supplicant.service @2.341s +5ms
                          └─dbus.service @1.042s
                            └─basic.target @1.036s
                              └─sockets.target @1.036s
                                └─snapd.socket @1.035s +590us
                                  └─sysinit.target @1.030s
                                    └─systemd-update-utmp.service @1.025s +5ms
                                      └─auditd.service @976ms +47ms
                                        └─systemd-tmpfiles-setup.service @964ms +9ms
                                          └─local-fs.target @962ms
                                            └─snapd.mounts.target @961ms
                                              └─snap-core18-2796.mount @417ms +543ms
                                                └─dev-loop9.device @961ms +628us

このコマンドは、指定した各ユニットまたはデフォルトのターゲットについて、タイムクリティカルなユニットのツリーを出力します。サービスの初期化は、ソケットの有効化とユニットの並列実行に依存する場合があります。blameコマンドと同様に、ユニットの有効化にかかる時間を表示します。これは、アクティブ状態に直接移行するデバイスユニットなどのユニットでは定義されていません。

ブートプロセス中に開始されたサービスのリストの表示(各サービスにかかった時間順に表示される)
> systemd-analyze blame
  9.197s NetworkManager-wait-online.service
  4.002s fwupd.service
  2.338s plymouth-quit-wait.service
  1.282s dracut-pre-udev.service
  1.062s sys-devices-platform-serial8250-tty-ttyS0.device
  1.062s dev-ttyS0.device
  1.061s dev-ttyS1.device
  1.061s sys-devices-platform-serial8250-tty-ttyS1.device
  1.060s dev-ttyS11.device
  1.060s sys-devices-platform-serial8250-tty-ttyS11.device
  1.059s sys-devices-platform-serial8250-tty-ttyS13.device
  1.059s dev-ttyS13.device
  1.059s sys-devices-platform-serial8250-tty-ttyS10.device
  1.059s dev-ttyS10.device
  1.058s sys-devices-platform-serial8250-tty-ttyS14.device
  1.058s dev-ttyS14.device
  1.058s dev-ttyS12.device
  1.058s sys-devices-platform-serial8250-tty-ttyS12.device
  1.056s sys-devices-platform-serial8250-tty-ttyS17.device

他のサービスの初期化が完了するまで待つために、あるサービスの初期化が遅くなることがあります。このコマンドを使用して、ユニットの有効化にかかる時間を表示します。これは、アクティブ状態に直接移行するデバイスユニットなどのユニットでは定義されていません。Type=simpleであるサービスの結果は表示されません。systemdは、これらのサービスは直ちに開始されると見なすので、初期化の遅延を分析できないためです。

ブートプロセス中に発生するイベントを表示するベクタグラフィックファイルの生成
> systemd-analyze plot > /temp/sample.svg

このコマンドは、tempディレクトリにSVGファイルを作成します。SVGファイルは、一連のグラフィックベクタを定義したテキストファイルで、LibreOffice Drawなどのアプリケーションでグラフを生成するために使用されます。

3 ユニットファイルの構造

systemdでは、ユニットとは、システムが操作および管理方法を認識しているリソースを指します。これは、systemdツールで使用されるプライマリオブジェクトです。これらのリソースは、設定ファイルであるユニットファイルを使用して定義します。systemdを使用する作業では、ユニットファイルを理解していると管理が容易になります。ユニットファイルではシンプルな宣言型の構文を使用するので、有効化したときにユニットの目的と効果を簡単に確認できます。ユニットファイルには、次のようにディレクティブを記述したセクションがあります。

[Section]
        Directive1=value
        Directive2=value
        . . .

各タイプのユニットファイルには以下のセクションがあります。

[Unit]

ほとんどのユニットファイルの先頭には[Unit]セクションがあります。このセクションを使用して、ユニットファイルのメタデータを定義し、ユニットファイルの他のユニットファイルとの関係を設定します。このセクションは、ユニットファイルの概要を記述していることから通常は先頭に配置されます。

[Automount] / [Mount] / [Path] / [Service] / [Slice] / [Socket] /[Swap] / [Timer]

ユニットファイルのタイプごとに固有のディレクティブを記述したセクションです。使用可能なすべてのユニットファイルのタイプについては4項 「ユニットファイルのタイプ」を参照してください。タイプdevicetargetsnapshot、およびscopeには、タイプ固有のセクションがないことに注意してください。

[Install]

これは多くの場合、ユニットファイルの最後のセクションであり、オプションです。このセクションを使用して、ユニットファイルが有効または無効なときのその動作を定義します。ユニットファイルを有効にすると、そのファイルはブート時に自動的に起動します。特定のユニットでは、適切に動作するために他の関連ユニットとの依存関係を持っていることがあります。たとえば、chronyにはディレクティブAfterWants、およびBeforeが必要で、これらはすべてchronyが動作するための依存関係です。

例 1: systemdのサービスファイル
[Unit]
Description=usbguard 1

[Service]
ExecStart=/usr/sbin/usb-daemon 2

[Install]
WantedBy=multi-user.target 3

1

サービスファイルの目的の簡単でわかりやすい説明。

2

サービスの開始時に実行するプログラムを指定します。

3

ネットワーキングを備えたマルチユーザシステムを起動します。グラフィカルな環境はありません。このディレクティブで依存関係を指定できます。

4 ユニットファイルのタイプ

ファイル拡張子でユニットのタイプを判断できます。systemdでは、記述されたリソースのタイプによってユニットが分類されています。

systemdで使用可能なユニットファイルのタイプは次のとおりです。

.service

サービスやアプリケーションをどのように管理するかを記述します。これには、サービスの開始または停止方法、設定ファイルの再ロード方法(該当する場合)、サービスを自動的に開始する条件、関連するユニットファイルの依存関係または階層情報が含まれます。

.scope

このユニットファイルは、systemdによって、D-Busインタフェースから受信した情報から自動的に作成され、外部で作成された一連のシステムプロセスを管理するために使用されます。

.path

パスを使用した有効化で使用するパスを定義します。デフォルトでは、ファイル名のベース名が同じ.serviceユニットファイルが有効になります。inotifyは、ファイルの変更に関する通知を受け取る必要があるプログラムで使用するカーネルAPIです。

.snapshot

systemctl snapshotコマンドによって.snapshotユニットファイルが自動的に作成されます。このコマンドでは、システムの現在の状態を表す一時的なスナップショットが作成されます。システムを変更するとその現在の状態を変更できます。一時的な状態のロールバックにはスナップショットを使用します。

.timer

systemdで管理するタイマを定義します。このタイマは、遅延または実行スケジュールを設定した有効化で使用するcronジョブに似ています。このタイマが設定値に達すると、ベース名が同じでファイル拡張子が.serviceであるユニットファイルが起動します。

.slice

Linuxのコントロールグループのノードを関連付けます。これにより、スライスに関連付けたプロセスへのリソース割り当てやリソース制限ができます。この名前は、コントロールグループツリーにおける階層を示します。ユニットは、そのタイプに応じてデフォルトでスライスに配置されます。

.target

ブート時または状態の変更時に他のユニットと同期状態にするか、システムを新しい状態にします。他のユニットでは、ターゲットの操作と同期するためにターゲットとの関係を指定します。

.socket

ソケットベースの有効化でsystemdが使用するネットワーク、IPCソケット、またはFIFOバッファを記述します。このユニットで定義したソケット上でアクティビティが確認されると起動する.serviceファイルがあります。

.device

ファイルシステムudevまたはsysfssystemdによる管理が指示されているデバイスを定義します。すべてのデバイスに.deviceファイルが存在するわけではありません。デバイスの順序指定、マウント、またはアクセスで、このユニットファイルが必要です。

.swap

システムのスワップ空間を定義します。ユニットファイルの名前は、この空間のデバイスまたはファイルパスを反映している必要があります。

.mount

systemdで管理するシステムのマウントポイントを定義します。このファイルには、スラッシュをダッシュに変更したマウントパスに基づく名前が割り当てられます。/etc/fstabのエントリには、自動的に作成されたユニットを指定できます。

.automount

自動的にマウントされるマウントポイントを定義します。参照するマウントポイントに基づくファイル名をファイルに割り当てます。マウントの詳細を定義するには、ベース名が同じ.mountユニットファイルが必要です。

5 ユニットの依存関係と順序

systemdには2種類の依存関係があります。要件の依存関係と順序の依存関係です。要件の依存関係では、ユニットを有効にするときに他のどのユニットを開始または停止するかを指定します。順序の依存関係では、ユニットを開始する順序を指定します。

ユニットの依存関係

ユニットファイルには依存関係の機能があります。ユニットを実行するために、他のユニットが1つ以上必要な場合があります。これらの依存関係は、ディレクティブWantsRequiresを使用してユニットファイルに設定します。

Wants

たとえば、ユニットAにWants=unit Bを記述している場合、ユニットAを実行するとユニットBも実行されます。ただし、ユニットBが正常に開始しなくても、正常に実行されているユニットAには何の影響もありません。

Requires

ユニットAにRequires=unit Bを記述している場合、両方のユニットが実行されますが、ユニットBが正常に実行されないとユニットAは無効になります。ユニットAのプロセスが正常に実行されているかどうかは関係ありません。

ユニットの順序

適切な指示がない場合、systemdではグループに属するユニットを同時に実行できます。正しい順序でサービスを開始することは、Linuxシステムが適切に機能するうえで重要です。ユニットファイルディレクティブBeforeAfterを使用して順序を設定できます。

Before

たとえば、ユニットAにBefore=unit Bを記述している場合、両方のユニットを実行すると、ユニットAが正常な実行状態になってからユニットBが実行されます。

After

ユニットAにAfter=unit Bを記述している場合、両方のユニットを実行すると、ユニットBが正常な実行状態になってからユニットAが実行されます。

6 ログ記録

ログファイルとジャーナルは、システム管理者にとって重要です。これらはシステムに関する詳細な情報を提供し、トラブルシューティングと監査において非常に重要です。ログファイルには、カーネル、アプリケーション、およびシステムにログインするユーザによって生成されたイベントとメッセージが含まれています。journalctlコマンドを使用してジャーナルに問い合わせることができます。このコマンドによって、systemdで収集されたログが表示されます。systemd-journaldサービスはsystemdのログ収集を扱います。systemd-journaldは、イベントとメッセージをバイナリ形式で保存します。

7 systemdのターゲット

systemdは、ユニットとターゲットを使用します。systemdユニットは、システム上のサービスまたはアクションを定義し、名前、タイプ、および設定ファイルで構成されます。systemdターゲットは、複数のユニットを組み合わせて、ターゲットを達成するにはどのサービスを開始する必要があるかを定義します。たとえば、サーバの場合、これはネットワークが実行されていて複数のユーザがログインできる状態です。これらのファイルは、サフィックス.targetで識別できます。

ユニットファイルと同様に、さまざまなターゲットを依存関係でネストできます。たとえば、multi-user.targetでは、(特に)ログインおよびユーザセッションサービスを設定するターゲットが必要です。

systemdの一般的なターゲット

default.target

デフォルトでブートします。default.targetファイルは、デスクトップワークステーションのgraphical.targetなど、真のターゲットファイルへのシンボリックリンクです。サーバの場合、通常はgraphical.targetです。

poweroff.target

システムをシャットダウンして、電源をオフにします。

rescue.target

ベースシステムをプルして、レスキューシェルセッションを開始するターゲットユニット。

multi-user.target

グラフィカルではない(コンソール)マルチユーザシステムをセットアップします。

graphical.target

ネットワークサービスを備えたグラフィカルマルチユーザシステムを使用します。

reboot.target

システムをシャットダウンして再起動します。

systemdターゲットの詳細については、man 5 systemd.targetおよびman 7 systemd.specialを参照してください。

8 通常のユーザとしてのsystemdの使用

セキュリティを強化する場合や、rootユーザ特権がない場合、systemdを通常のユーザとして使用できます。非特権サービスを実行するには、userサービスを作成します。

ユーザサービスを作成および使用する際には、次の点を考慮してください。

  • ユーザサービスセッションは、ユーザのセッションが終了すると終了します。loginctl enable-linger USERNAMEコマンドを使用することで、この設定を無効にすることができます。

  • ユーザサービスファイルは、/etc/systemd/userまたは$HOME/.config/systemd/user/にあります。

  • systemctl --userコマンドを使用してユーザサービスを制御できます。

9 systemctlコマンド

systemctlコマンドは、systemdおよびサービスマネージャの状態を調べ、制御するために使用されます。

次の一般的なsystemctlコマンドを使用できます。man systemctlのページを参照してください。

9.1 systemdの情報の表示

systemdコンポーネントに関する情報を表示するには、次のコマンドを使用できます。

systemctl list-units

systemdユニットを一覧表示します。オプションの引数--state=runningを使用するとアクティブなユニットを表示し、--type=serviceを使用すると、終了したアクティブなユニットを表示できます。

systemctl list-unit-files

systemdのユニットとステータスを一覧にします。ステータスには、静的、生成済み、無効、エイリアス、マスク、有効などがあります。

systemctl list-dependencies

依存関係ツリーを一覧表示します。

systemctl list-dependencies UNIT_FILE

ユニットファイルの依存関係を一覧表示します。

9.2 systemdサービスの管理

systemctlコマンドでは、サービスに関する次のタスクを実行できます。

systemctl status SERVICE

特定のサービスの状態を確認します。

systemctl show SERVICE

サービス情報を表示します。

systemctl start SERVICE

サービスを手動で開始する代わりにstartコマンドを使用します。設定ファイルの記述を変更した場合は、関連するサービスを開始する必要があります。

systemctl stop SERVICE

実行している特定のサービスを停止します。

systemctl restart SERVICE

サービスを手動で再開する代わりにrestartコマンドを使用します。設定ファイルの記述を変更した場合は、関連するサービスを再開する必要があります。

systemctl enable SERVICE

ブート時にサービスを有効にします。

systemctl disable SERVICE

ブート時にサービスを無効にします。

systemctl reload-or-restart SERVICE

再ロードできるサービスであれば再ロードし、再ロードできないサービスであれば再開します。サービスが実行されていない場合は再開します。

systemctl mask SERVICE

サービスがマスクされている場合、ユニットファイルが/dev/nullにシンボリックリンクされています。マスクされたサービスのシンボリックリンクは、/dev/nullを指すように/etc/systemd/systemから作成されます。その結果、サービスを別の有効なサービスが必要としていても、そのサービスはロードできません。このようなサービスは手動で停止する必要があります。停止しないとバックグラウンドで実行が継続します。--runtimeオプションを使用すると、システムの次回再起動までサービスを一時的にマスクできます。

Created symlink /etc/systemd/system/FOSSLinux.service → /dev/null.
systemctl unmask SERVICE

サービスのマスクを解除します。システムを手動で開始または再開する場合に効果的です。

9.3 システムの状態の管理

systemctlコマンドでは、再起動、シャットダウンなど、システム上で次に示すような電源管理プロセスを実行できます。

systemctl reboot

システムを再起動します(reboot.target)。

systemctl poweroff

システムの電源をオフにします(poweroff.target)。

systemctl emergency

緊急モードへ移行します(emergency.target)。

systemctl default

デフォルトのターゲットへ戻ります(multi-user.target)。

10 systemdのトラブルシューティング

次のトラブルシューティングのヒントを使用すると、systemdサービスの問題を特定して解決し、システムの円滑な動作を保証できます。

systemd-analyze verify SERVICEを使用してsystemdユニットファイルの構文を確認

systemdサービスを開始または有効化する前に、ユニットファイルの構文にエラーがないことを確認します。次に例を示します。

> sudo systemd-analyze verify /etc/systemd/system/my-custom-service.service

このコマンドは、ユニットファイルを分析して、構文エラー、不足しているファイルなどの問題を報告します。サービスを有効にして開始する前に、報告された問題を修正する必要があります。

journalctl -u SERVICEコマンドを使用してサービスのログを確認

systemdサービスで問題が発生した場合は、そのサービスのログを確認します。次に例を示します。

> sudo  journalctl -u my-custom-service.service

このコマンドは指定されたサービスのログを表示します。このログにはエラーメッセージや警告などの関連情報が記録されています。これらのログを使用して、サービスの問題を特定して修正できます。

systemd-analyze plotコマンドを使用してブートプロセスを視覚化

ブートプロセス中にサービスで問題が発生している場合は、systemd-analyze plot commandを使用してブートプロセスを視覚化し、問題を特定できます。次に例を示します。

> sudo systemd-analyze plot > boot-plot.svg

このコマンドでは、ブートプロセスと潜在的な問題のグラフィカル表現が含まれるboot-plot.svgというSVGファイルが作成されます。各サービスの開始時刻と停止時刻も含まれます。このファイルをSVG互換の画像ビューアまたはWebブラウザで開き、ブートプロセスで発生する問題の原因となっているサービスを分析できます。

障害が発生したサービスのトラブルシューティング

障害が発生したサービスを確認し、ログ出力を検査するには、次のコマンドを実行します。

> sudo systemctl --state=failed
実行しているサービスの状態を確認

実行しているサービスの現在の状態を確認するには次のコマンドを実行します。

> sudo systemctl status SERVICE
長時間を要するシャットダウンや再起動

シャットダウンや再起動に長時間を要する場合は、終了していないサービスがあることが考えられます。systemdは、各サービスの強制終了を試みる前に、その終了を一定時間待機します。多く見られる問題は、保留状態のサービスやシャットダウンの停止です。これを確認するには次のコマンドを使用します。

> sudo systemctl poweroff
  Failed to power off system via logind: There's already a shutdown or sleep operation in progress
> sudo systemctl list-jobs

実行中および待機中のジョブをキャンセルし、再度シャットダウンまたは再起動することができます。

> sudo systemctl cancel
> sudo systemctl stop systemd-suspend.service

11 systemdのベストプラクティス

いくつかのベストプラクティスに従うことで、さまざまな状況に対応できる効率的なsystemdサービスを実現できます。

実行しているサービスの状態を確認

実行しているサービスの現在の状態を確認するには次のコマンドを実行します。

> sudo systemctl status SERVICE
systemdユニットファイルでは絶対パスを使用

設定ファイルや、systemdユニットファイルのスクリプトなど、実行可能ファイルや必須ファイルには絶対パスを使用します。systemdでは、$PATHなどのユーザの環境変数がファイルの検索に使用されません。

ExecReloadディレクティブの使用

systemctl reloadコマンドでサービスを再ロードするときに実行する特定のコマンドを定義するには、[SERVICE]セクションでExecReloadディレクティブを使用します。再起動を伴わずに設定を動的に再ロードできるサービスで、このディレクティブが効果的です。

[Service]
ExecStart=PATH_TO_EXECUTABLE
ExecReload=PATH_TO_RELOAD_SCRIPT
RestartSecディレクティブの使用

障害が発生した後でサービスを再起動するまでの遅延時間を秒の単位で定義するには、[SERVICE]セクションでRestartSecディレクティブを使用します。リソースを解放するために指定の時間を必要とするサービスや、システムに対する過大な負荷の原因となりかねない急速な再起動ループを防止するサービスで、このディレクティブが効果的です。

[Service]
ExecStart=PATH_TO_EXECUTABLE
Restart=on-failure
RestartSec=5
リモートコンピュータでの緊急モードの無効化

リモートコンピュータでの緊急モードを無効化できます。このようなコンピュータとして、Google Cloudでホストされている仮想マシンなどがあります。このモードが有効な場合、そのコンピュータはネットワークへの接続をブロックされます。次に例を示します。

> sudo systemctl mask emergency.service
> sudo systemctl mask emergency.target