第 3 章 SYSTEMD によるサービス管理
3.1. SYSTEMD の概要
3.1.2. 互換性の変更点
systemd システムおよびサービスマネージャーは、その大部分が SysV init および Upstart と互換性があ
るように設計されています。以下では、SysV init を使用していた Red Hat Enterprise Linux 6 システムと 比較して、互換性について最も重要な変更点を挙げています。
systemd のランレベルのサポートは限定的なものです。ランレベルに直接マッピング可能な
ターゲットユニットを数多く提供し、互換性のために以前の runlevel コマンドで配布されま す。ただし、systemd ターゲットのすべてがランレベルに直接マッピングできるわけではない ため、このコマンドが不明なランレベルを示す N を返す場合もあります。可能な場合
は、runlevel コマンドの使用を避けることが推奨されます。
systemd ターゲットの詳細と、ランレベルとの比較は、「systemd ターゲットでの作業」を参
照してください。
systemctl ユーティリティーは、カスタマイズされたコマンドをサポートしません。SysV init スクリプトでは、start、stop、status といった標準のコマンドのほかに、任意のコマンドを実 装して多くの機能を提供できます。たとえば、iptables の init スクリプトは、panic コマンド で実行できます。これにより、パニックモードが即座に有効になり、システムを再設定して受 信パケットおよび送信パケットをすべて切断します。これは systemd ではサポートされておら ず、systemctl は文書化されたコマンドのみ受け付けます。
systemctl ユーティリティーの詳細と、以前の service ユーティリティーとの比較は、表 3.3「service ユーティリティーと systemctl の比較」を参照してください。
systemctl ユーティリティーは、systemd が開始していないサービスとは通信しませ
ん。systemd がシステムサービスを開始すると、メインプロセスの ID を保存して、メインプロ セスを追跡します。すると、systemctl ユーティリティーがこの PID を使用してクエリーを行 い、サービスを管理します。このため、ユーザーがコマンドラインで特定のデーモンを直接開 始すると、systemctl がそのデーモンの最新の状態を判断したり、停止したりすることができ ません。
systemd が停止するのは、実行中のサービスのみです。Red Hat Enterprise Linux 6 以前のリ リースでは、シャットダウンシーケンスが開始すると、/etc/rc0.d/ ディレクトリーにあるシン ボリックリンクを使用して、利用可能なシステムサービスをそのステータスに関係なくすべて 停止していました。systemd では、実行中のサービスだけを、シャットダウン時に停止しま す。
システムサービスは、標準の入力ストリームからは読み取れません。systemd がサービスを開 始すると、標準入力を /dev/null に接続し、ユーザーとの対話を行わないようにします。
システムサービスは、呼び出したユーザーやそのセッションから、(環境変数 HOME、PATH な どの) コンテキストを継承しません。各サービスは、クリーンな実行コンテキストで実行しま す。
SysV init スクリプトを読み込む際に、systemd は Linux Standard Base (LSB) ヘッダーにエン コードされている依存関係情報を読み取り、ランタイム時に解釈します。
サービスユニット上のすべての操作は、デフォルトで 5 分でタイムアウトになるように設定さ れており、サービスの故障でシステムがフリーズすることを防ぎます。この値は initscript から 生成されるサービス用にハードコーディングされ、変更することができません。ただし、個別 の設定ファイルを使用して、サービスごとにタイムアウト値を長くすることができます。例 3.11「タイムアウト制限の変更」を参照してください。
systemd で導入された互換性の変更点に関する詳細なリストは、Red Hat Enterprise Linux 7 の『 移行 計画ガイド』を参照してください。
3.2. システムサービスの管理
以前のバージョンの Red Hat Enterprise Linux は、SysV init または Upstart で配布されてお
り、/etc/rc.d/init.d/ ディレクトリーにある init スクリプトスクリプトを使用していました。この init スクリプトは
通常の Bash で書かれており、システム管理者がシステム内で、サービスの状態とデーモンを管理でき
るようになっていました。Red Hat Enterprise Linux 7 では、この init スクリプトは、サービスユニットサービスユニット に代わっています。
サービスユニットは、ファイル拡張子 .service で終わり、init スクリプトと同様の役割を担います。シ ステムサービスの表示、開始、停止、再開、有効化、または無効化には、「service ユーティリティー と systemctl の比較」、「chkconfig ユーティリティーと systemctl の比較」、および本セクションで説 明されているように、systemctl コマンドを使用します。service コマンドおよび chkconfig コマンド は、引き続きシステムで利用可能になっており、期待通りに機能しますが、これらは互換性のために含 まれており、使用は推奨されていません。
表
表3.3 service ユーティリティーとユーティリティーと systemctl の比較の比較
service systemctl 説明説明
service name start systemctl start name.service サービスを起動します。
service name stop systemctl stop name.service サービスを停止します。
service name restart systemctl restart name.service
サービスを再起動します。
service name condrestart systemctl try-restart name.service
サービスが実行中の場合のみ、再 起動します。
service name reload systemctl reload name.service
設定を再読み込みします。
service name status systemctl status name.service systemctl is-active name.service
サービスが実行中かどうかを チェックします。
service --status-all systemctl list-units --type service --all
すべてのサービスのステータスを 表示します。
service systemctl 説明説明
表
表3.4 chkconfig ユーティリティーとユーティリティーと systemctl の比較の比較
chkconfig systemctl 説明説明
chkconfig name on systemctl enable name.service
サービスを有効にします。
chkconfig name off systemctl disable name.service
サービスを無効にします。
chkconfig --list name systemctl status name.service
systemctl is-enabled name.service
サービスが有効かどうかを確認し ます。
chkconfig --list systemctl list-unit-files --type service
サービスを一覧表示し、各サービ スが有効かどうかを確認します。
chkconfig --list systemctl list-dependencies --after
指定されたユニットの前に開始す るように指定されているサービス を一覧表示します。
chkconfig --list systemctl list-dependencies --before
指定されたユニットの後に開始す るように指定されているサービス を一覧表示します。
サービスユニットの指定 サービスユニットの指定
分かりやすくするため、本セクションの残りの部分のコマンド例では、.service ファイル拡張子がつい た完全なユニット名を使用します。以下に例を示します。
# systemctl stop nfs-server.service
ただし、ファイル拡張子は省略することができます。省略すると、systemctl は、引数がサービスユ ニットであることを想定します。以下のコマンドは、上記のコマンドと同等のものになります。
# systemctl stop nfs-server
また、ユニットによってはエイリアス名を持つものもあります。この名前は、ユニット名よりも短くす ることができ、ユニット名の代わりとして使用できます。特定のユニットに使用できるエイリアスを見 つけるには、以下のコマンドを実行します。
# systemctl show nfs-server.service -p Names chroot 環境における環境における systemctl の挙動の挙動
chroot コマンドを使用して root ディレクトリーを変更すると、ほとんどの systemctl コマンドは、ア クションの実行をすべて拒否します。なぜなら、systemd プロセスと、chroot コマンドを使用してい るユーザーでは、ファイルシステムの見え方が異なるからです。このような状況は、systemctl がキッキッ クスタート
クスタートファイルから呼び出されたときなどに発生します。
例外が、systemctl enable や systemctl disable などのユニットファイルコマンドです。このコマンド は、実行中のシステムを必要とせず実行中のプロセスに影響を与えませんが、ユニットファイルには影 響を及ぼします。したがってこのようなコマンドは、chroot 環境であっても実行することが可能で す。たとえば、/srv/website1/ ディレクトリー配下で、システムの httpd サービスを有効にするとき は、以下のコマンドを実行します。
# chroot /srv/website1
# systemctl enable httpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service, pointing to /usr/lib/systemd/system/httpd.service.
3.2.1. サービスの一覧表示
読み込み済みのサービスユニットの一覧を表示するには、シェルプロンプトで以下を実行します。
systemctl list-units --type service
各サービスのユニットファイルに対して、このコマンドは正式名 (UNIT) の後に、そのユニットファイ ルが読み込まれているかどうか (LOAD)、そのユニットファイルアクティベーションの状態の概要
(ACTIVE) および詳細 (SUB) な状態、そして簡単な説明 (DESCRIPTION) を示します。
デフォルトでは、systemctl list-units コマンドは、アクティブなユニットのみを表示します。状態に 関係なく読み込み済みユニットをすべて表示する場合は、コマンドラインオプションの --all または -a を付けて、以下のコマンドを実行します。
systemctl list-units --type service --all
また、利用可能なサービスユニットを一覧表示して、各ユニットが有効かどうかを確認できます。これ には、以下のコマンドを実行します。
このコマンドにより、各サービスユニットの完全な名前 (UNIT FILE) と、サービスユニットが有効かど
うか (STATE) が表示されます。個別のサービスユニットの状態を判断する方法は「サービスステータ
スの表示」を参照してください。
例
例3.1 サービスの一覧表示サービスの一覧表示
読み込み済みのサービスユニットの一覧を表示するには、以下のコマンドを実行します。
$ systemctl list-units --type service
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-vmcore.service loaded active exited Harvest vmcores for ABRT abrt-xorg.service loaded active running ABRT Xorg log watcher
abrtd.service loaded active running ABRT Automated Bug Reporting Tool
…
systemd-vconsole-setup.service loaded active exited Setup Virtual Console tog-pegasus.service loaded active running OpenPegasus CIM Server LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
46 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'
インストール済みのサービスユニットファイルを一覧表示して、そのユニットが有効かどうかを判 断するには、以下コマンドを実行します。
$ systemctl list-unit-files --type service UNIT FILE STATE abrt-ccpp.service enabled abrt-oops.service enabled abrt-vmcore.service enabled abrt-xorg.service enabled abrtd.service enabled
…
wpa_supplicant.service disabled ypbind.service disabled 208 unit files listed.
3.2.2. サービスステータスの表示
システムサービスに対応するサービスユニットに関する詳細情報を表示するには、シェルプロンプトで 以下を実行します。
systemctl status name.service
name を、確認するサービスユニット名 (gdm など) に置き換えます。このコマンドは、選択したサー ビスユニット名の後に、表3.5「利用可能なサービスユニットの情報」に記載されている 1 つ以上の フィールド、さらに root ユーザーが実行している場合は最新のログエントリーを表示します。