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
コマンドは、引き続きシステムで利用可能になっており、期待通りに機能しますが、これらは互換性のために含まれており、使用は推奨されていません。
サービス | systemctl | 詳細 |
---|---|---|
|
| サービスを起動します。 |
|
| サービスを停止します。 |
|
| サービスを再起動します。 |
|
| サービスが実行中の場合のみ、再起動します。 |
|
| 設定を再読み込みします。 |
|
| サービスが実行中かどうかをチェックします。 |
|
| すべてのサービスのステータスを表示します。 |
chkconfig | systemctl | 詳細 |
---|---|---|
|
| サービスを有効にします。 |
|
| サービスを無効にします。 |
|
| サービスが有効かどうかを確認します。 |
|
| サービスをリスト表示し、各サービスが有効かどうかを確認します。 |
|
| 指定されたユニットの前に開始するように指定されているサービスをリスト表示します。 |
|
| 指定されたユニットの後に開始するように指定されているサービスをリスト表示します。 |
サービスユニットの指定
分かりやすくするため、本セクションの残りの部分のコマンド例では、.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.
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
ユーザーが実行している場合は最新のログエントリーが表示されます。
フィールド | 説明 |
---|---|
| サービスユニットが読み込まれているかどうか、ユニットファイルへの絶対パス、ユニットが有効かどうかについての説明 |
| サービスユニットが実行中かどうかの説明と、タイムスタンプ |
| 対応するシステムサービスの PID と、その名前 |
| 対応するシステムサービスに関する追加情報 |
| 関連プロセスに関する追加情報 |
| 関連するコントロールグループ (cgroup) に関する追加情報 |
特定のサービスユニットが実行中かどうかだけを確認する場合は、以下のコマンドを実行します。
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 [output truncated]
例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 サーバー用のサービスユニットは 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
サービスを起動すると、systemd は、自動的に postfix
を停止します。 この 2 つのサービスは競合するため、同じポートでは実行できません。