10.2. システムサービスの管理

注記

専門知識のさらなる拡充を図るには、Red Hat System Administration II (RH134) トレーニングコースもあります。
以前のバージョンの Red Hat Enterprise Linux は SysV init または Upstart で配布されており、/etc/rc.d/init.d/ にある init スクリプト を使用していました。これらの init スクリプトは通常 Bash で書かれており、システム管理者がシステムの状態とシステム内のデーモンを管理できるようになっていました。Red Hat Enterprise Linux 7 では、これらの init スクリプトは、サービスユニット に代わっています。
サービスユニットは、ファイル拡張子.service で終わり、init スクリプトと同様の目的を果たします。システムサービスの表示、開始、停止、再開、有効化、無効化には、表10.3「service ユーティリティーと systemctl の比較」表10.4「chkconfig ユーティリティーと systemctl の比較」、および本セクションで説明されているように、systemctl コマンドラインを使用します。service および chkconfig はシステム内で利用可能でまだ機能しますが、これらは互換性のために含まれており、使用は推奨されていません。

表10.3 service ユーティリティーと systemctl の比較

サービス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
すべてのサービスのステータスを表示します。

表10.4 chkconfig ユーティリティーと systemctl の比較

chkconfigsystemctl詳細
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 enablesystemctl 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.

10.2.1. サービスの一覧表示

読み込み済みの最新サービスユニットを一覧表示するには、シェルプロンプトで以下を入力します。
systemctl list-units --type service
このコマンドにより、各サービスユニットファイルの完全な名前 (UNIT)、ユニットファイルが読み込み済みかどうか (LOAD)、高レベル (ACTIVE) および低レベル (SUB) のユニットファイルのアクティベーション状態、そして簡単な説明 (DESCRIPTION) が示されます。
デフォルトでは、systemctl list-units コマンドはアクティブなユニットのみを表示します。状態に関係なく読み込み済みユニットをすべて表示したい場合は、--all オプションまたは -a オプションを付けてコマンドを実行します。
systemctl list-units --type service --all
また、利用可能なサービスユニットを一覧表示させて、それらが有効かどうかを確認できます。これには、以下を入力します。
systemctl list-unit-files --type service
このコマンドにより、各サービスユニットの完全な名前 (UNIT FILE) と、サービスユニットが有効かどうか (STATE) が表示されます。個別のサービスユニットの状態を判断する方法は 「サービスステータスの表示」 を参照してください。

例10.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.

10.2.2. サービスステータスの表示

システムサービスに対応するサービスユニットに関する詳細情報を表示するには、シェルプロンプトで以下を入力します。
systemctl status name.service
name を、調べたいサービスユニット名 (たとえば gdm) に置き換えます。このコマンドでは、選択されたサービスユニット名の後に、その説明と、表10.5「利用可能なサービスユニットの情報」 にある 1 つ以上のフィールド、さらに root ユーザーが実行している場合は最新のログエントリーが表示されます。

表10.5 利用可能なサービスユニットの情報

フィールド詳細
Loadedサービスユニットが読み込まれているかどうか、ユニットファイルへの絶対パス、ユニットが有効かどうかについての説明。
Activeサービスユニットが実行中かどうかの情報の後に、タイムスタンプが続きます。
Main PID対応するシステムサービスの PID の後に、その名前が続きます。
Status対応するシステムサービスに関する追加情報。
Process関連プロセスに関する追加情報。
CGroup関連する Control Group (cgroups) に関する追加情報。
特定のサービスユニットが実行中かどうかだけを確認する場合は、以下のコマンドを実行します。
systemctl is-active name.service
同様に、特定のサービスユニットが有効かどうかを判断するには、以下を入力します。
systemctl is-enabled name.service
systemctl is-active および systemctl is-enabled は両方とも、指定されたサービスユニットが実行中または有効な場合に、0 の終了ステータスを返すことに注意してください。現在読み込み済みのサービスユニットを一覧表示する方法は 「サービスの一覧表示」 を参照してください。

例10.2 サービスステータスの表示

GNOME Display Manager のサービスユニット名は gdm.service になります。このサービスユニットの現在のステータスを判断するには、シェルプロンプトで以下を入力します。
~]# systemctl status gdm.service
gdm.service - GNOME Display Manager
   Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled)
   Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago
 Main PID: 1029 (gdm)
   CGroup: /system.slice/gdm.service
           ├─1029 /usr/sbin/gdm
           ├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno...
           └─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r...

Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.

例10.3 サービスの前に開始するように命令されているサービスの表示

特定のサービスの前に開始するサービスを確認するには、シェルプロンプトで次のコマンドを入力します。
~]# systemctl list-dependencies --after gdm.service
gdm.service
├─dbus.socket
├─getty@tty1.service
├─livesys.service
├─plymouth-quit.service
├─system.slice
├─systemd-journald.socket
├─systemd-user-sessions.service
└─basic.target[出力は省略されています]

例10.4 サービスの後に開始するように命令されているサービスの表示

特定のサービスの後に開始するサービスを確認するには、シェルプロンプトで次のコマンドを入力します。
~]# systemctl list-dependencies --before gdm.service
gdm.service
├─dracut-shutdown.service
├─graphical.target
│ ├─systemd-readahead-done.service
│ ├─systemd-readahead-done.timer
│ └─systemd-update-utmp-runlevel.service
└─shutdown.target
  ├─systemd-reboot.service
  └─final.target
    └─systemd-reboot.service

10.2.3. サービスの起動

システムサービスに対応するサービスユニットを開始するには、root でシェルプロンプトに以下を入力します。
systemctl start name.service
name を、開始するサービスユニット名 (たとえば、gdm) に置き換えます。このコマンドは、選択したサービスを現行セッションで開始します。起動時にサービスユニットを開始するようにする方法は、「サービスの有効化」 を参照してください。特定のサービスユニットのステータスを判断する方法は、「サービスステータスの表示」 を参照してください。

例10.5 サービスの起動

Apache HTTP Server のサービスユニット名は httpd.service になります。このサービスユニットをアクティブにし、現行セッションで httpd デーモンを開始するには、root で以下のコマンドを実行します。
~]# systemctl start httpd.service

10.2.4. サービスの停止

システムサービスに対応するサービスユニットを停止するには、root でシェルプロンプトに以下を入力します。
systemctl stop name.service
name を、停止するサービスユニット名 (たとえば、bluetooth) に置き換えます。このコマンドは、選択したサービスユニットを現行セッションで停止します。起動時にサービスユニットを無効にし、開始しないようにする方法は「サービスの無効化」を参照してください。特定のサービスユニットの状態を確認する方法は「サービスステータスの表示」を参照してください。

例10.6 サービスの停止

bluetoothd デーモンのサービスユニット名は bluetooth.service になります。このサービスユニットを無効にし、bluetoothd デーモンを現行セッションで停止するには、root で以下のコマンドを実行します。
~]# systemctl stop bluetooth.service

10.2.5. サービスの再開

システムサービスに対応するサービスユニットを再開するには、root でシェルプロンプトに以下を入力します。
systemctl restart name.service
name 、を再開するサービスユニット名 (たとえば、httpd) に置き換えます。このコマンドは、選択したサービスユニットを現行セッションで停止し、即座に再起動します。重要な点は、選択したサービスユニットが実行中でない場合は、このコマンドがそのサービスユニットを起動するということです。対応するサービスがすでに実行中の場合にのみ、サービスユニットを再起動するように systemd に指示するには、root で以下のコマンドを実行します。
systemctl try-restart name.service
特定のシステムサービスでは、サービスの実行を中断することなく設定の再読み込みが可能です。これを実行するには、root で以下を入力します。
systemctl reload name.service
この機能をサポートしないシステムサービスは、このコマンド自体を無視することに注意してください。便宜上、代わりに systemctl コマンドでは、この機能をサポートしないサービスを再起動する reload-or-restart コマンドおよび reload-or-try-restart コマンドもサポートします。特定のサービスユニットのステータスを確認する方法は 「サービスステータスの表示」 を参照してください。

例10.7 サービスの再開

ユーザーが不要なエラーメッセージや部分的に表示される Web ページに遭遇しないようにするため、Apache HTTP Server では設定を再起動せずかつ処理されたリクエストをアクティブに妨害せずに、設定の編集および再読み込みができます。これを行うには、root でシェルプロンプトに以下を入力します。
~]# systemctl reload httpd.service

10.2.6. サービスの有効化

システムサービスに対応するサービスユニットを起動時に自動的に起動するように設定するには、root でシェルプロンプトに以下を入力します。
systemctl enable name.service
name を、有効にするサービスユニット名 (たとえば、httpd) に置き換えます。このコマンドは、選択したサービスユニットの [Install] セクションを読み取り、/etc/systemd/system/ ディレクトリーおよびそのサブディレクトリーにある/usr/lib/systemd/system/name.service ファイルへの適切なシンボリックリンクを作成します。ただし、このコマンドは既存のリンクを上書きしません。シンボリックリンクが確実に再度作成されるようにするには、root で以下のコマンドを使用します。
systemctl reenable name.service
このコマンドは、選択したサービスユニットを無効にし、即座に再度有効にします。特定のサービスユニットが起動時に有効になるかどうかを確認する方法は 「サービスステータスの表示」 を参照してください。現行セッションでサービスを開始する方法は 「サービスの起動」 を参照してください。

例10.8 サービスの有効化

Apache HTTP Server が起動時に自動的に開始するように設定するには、root で以下のコマンドを実行します。
~]# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

10.2.7. サービスの無効化

システムサービスに対応するサービスユニットを起動時に自動的に起動しないようにするには、root でシェルプロンプトに以下を入力します。
systemctl disable name.service
name を、無効にするサービスユニット名 (たとえば、bluetooth) に置き換えます。このコマンドは、選択したサービスユニットの [Install] セクションを読み取り、/etc/systemd/system/ ディレクトリーおよびそのサブディレクトリーから/usr/lib/systemd/system/name.service ファイルへの適切なシンボリックリンクを削除します。さらに、サービスユニットにマスクをして、手動で開始したり、別のサービスがこれを開始することを防ぐことができます。これを実行するには、root で以下のコマンドを実行します。
systemctl mask name.service
このコマンドは、/etc/systemd/system/name.service ファイルを /dev/null へのシンボリックリンクに置き換え、実際のユニットファイルが systemd にアクセスできないようにします。このアクセスを元に戻してサービスユニットをアンマスクするには、root で以下を入力します。
systemctl unmask name.service
特定のサービスユニットが起動時に有効になるかどうかを確認する方法は 「サービスステータスの表示」 を参照してください。現行セッションでサービスを停止する方法は 「サービスの停止」 を参照してください。

例10.9 サービスの無効化

例10.6「サービスの停止」 では、現行セッションで bluetooth.service ユニットを停止する方法を説明しています。このサービスユニットが起動時に開始しないようにするには、root でシェルプロンプトに以下を入力します。
~]# systemctl disable bluetooth.service
Removed symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service.
Removed symlink /etc/systemd/system/dbus-org.bluez.service.

10.2.8. 競合するサービスの起動

systemd では、サービス間に正と負の依存関係が存在します。特定のサービスを起動するとき、別のサービスを 1 つまたは複数起動 (正の依存関係)、あるいはサービスを 1 つまたは複数停止 (負の依存関係) することが必要となる場合があります。
ユーザーが新しいサービスを起動しようとすると、 systemd がすべての依存関係を自動的に解決します。これは、ユーザーに明示的に通知されることなく実行されるため注意が必要です。サービス実行しているときに、負の依存関係を持つ別のサービスを起動しようとすると、実行しているサービスが自動的に停止します。
たとえば postfix サービスを実行しているときに sendmail サービスを実行しようとすると、最初に systemdpostfix を自動的に停止させます。これら 2 つのサービスは競合しており、同じポートで実行させることができないためです。