第8章 systemd デーモン

目次

8.1. 基本的な使いかた
8.2. システムの起動とターゲットの管理
8.3. 高度な使い方
8.4. さになる情報

systemd プログラムは、プロセス ID が 1 であるプロセスです。これはシステム の起動時に、その初期化処理を指定通りの方法で行なうために利用します。 systemd はカーネルから直接起動して使用するもので、通常はプロセスを kill するために使用するシグナル 9 を、無視して動作します。その他のプログラム は systemd から直接起動されるか、もしくは直接起動されたプロセスの子や孫の プロセスとして起動されることになります。

[Note]System V init と systemd の違いについて

完全な互換性を確保する目的で、 systemd と System V init は、それぞれ その場で置き換えて使用することができます。 systemd ではなく System V init を使用したい場合は、起動画面で F5 を押し、 System V を選択してください。また、 System V init を 今後も恒久的に使用したい場合は、 sysvinit-init パッケージをインストールし、 systemd-init パッケージと入れ替えてください。

openSUSE 12 以降のバージョンでは、 System V init デーモンは systemd に置き換えられるようになりました。 systemd は System V init との完全な 互換性 (init スクリプトに対応しているため) があるほか、 systemd では サービスの起動を同時並行で行なう仕組みになっているため、起動にかかる時間が 大きく短縮されています。これに加えて、 systemd ではサービスを必要なときに だけ起動します。たとえば印刷用のデーモンである cupsd はシステムの起動時には開始されませんが、起動後にはじめてユーザが文書を 印刷しようとしたときに起動されます。また、 systemd ではカーネルの コントロールグループ (cgroups) にも対応しているほか、システムの状態を スナップショットに保存したり、その状態に復元したりすることもできます。 詳しくは http://www.freedesktop.org/wiki/Software/systemd/ をお読みください。

8.1. 基本的な使いかた

System V init の仕組みでは、複数のコマンドを利用してサービスを処理していました —init スクリプトや insserv, telinit などのコマンドがそれにあたります。 systemd では、サービスに対する主な処理を 実行する際、コマンド 1 つで済むようになっています。それが systemctl で、 gitzypper のように、コマンドの 後ろにサブコマンドを指定して実行します:

systemctl [一般オプション] サブコマンド [サブコマンドのオプション]

詳しくは、 man 1 systemctl で表示されるマニュアルページをお読みください。

[Tip]端末の出力と bash の補完について

systemd のコマンドは、出力先が端末である場合 (パイプやファイルなどで ない場合) 、既定ではページャ機能が動作し、長い出力を順に読むことができるように なっています。この機能を無効化するには、 --no-pager オプションを ご利用ください。

systemd では、 bash による補完にも対応しています。サブコマンドの頭文字 1 文字を入力し、 <Tab> を押すと、サブコマンドの残りを 自動的に入力することができます。ただし、この機能は、 bash シェルを利用している場合にのみ使うことができるもので、 bash-completion パッケージを インストールしておく必要があります。

8.1.1. 動作中のシステムに対するサービスの管理

サービスを管理するためのサブコマンドは、 System V init でのサービス管理 コマンドと同じ (start, stop, ...) です。一般的な使い方は下記のとおりです:

systemd
systemctl reload|restart|start|status|stop|... <my_service(s)>.service
SysV init
rc<サービス名> reload|restart|start|status|stop|...

systemd では、複数のサービスを一括で管理することもできます。 init スクリプト をそれぞれ実行しなければならなかった System V init とは異なり、下記のように 実行します:

systemctl start <1 つめのサービス>.service <2 つめのサービス>.service

下記の表には、 systemd と System V init におけるサービス管理コマンドを、 それぞれ並べています:

表8.1 サービス管理コマンド

作業

systemd でのサブコマンド

SysV init でのサブコマンド

起動

start
start

停止

stop
stop

再起動

サービスを停止し、その後に起動し直します。 その時点でサービスが起動していなかった場合は、起動する 場合と同じ意味になります。

restart
restart

条件付きの再起動

サービスが現在動作中の場合、サービスを再起動します。 動作していなかった場合は、何も行ないません。

try-restart
try-restart

再読み込み

サービスの動作を止めることなく、そのサービスに対する設定 ファイルを読み込み直します。これはたとえば、 Apache に対して修正後の httpd.conf を読み込ませたりする、などの 使い方をします。全てのサービスが再読み込みに対応しているとは 限らないことに注意してください。

reload
reload

再読み込みまたは再起動

指定のサービスが再読み込みに対応していればそれを行ない、 対応していなければ再起動を行ないます。その時点でサービスが 動作していなかった場合は、単純に起動を行ないます。

reload-or-restart
n/a

条件付きの再読み込みまたは再起動

指定のサービスが再読み込みに対応していればそれを行ない、 対応していなければ再起動を行ないます。その時点でサービスが 動作していなかった場合は、何も行ないません。

reload-or-try-restart
n/a

詳細な状態情報を取得する

サービスの状態について、情報を表示します。 systemd のコマンド では、説明や実行ファイル、状態や CGroup のほか、直近でサービスが出力 したメッセージなど (詳しくは 8.1.2項 「サービスのデバッグ」 をお読みください) を表示します。 SysV init とは、表示される詳細のレベルが異なります。

status
status

簡潔な状態情報を取得する

サービスが動作しているかどうかを表示します。

is-active
status

8.1.2. サービスのデバッグ

既定では、 systemd は過剰に冗長な出力を行ないません。サービスの起動が 成功した場合は何も出力されず、失敗した場合にのみ短いエラーメッセージを 表示します。起動についてデバッグしたり、サービスの操作状態を確認したり したい場合は、 systemctl status コマンドをお使いください。

systemd は、独自のログ機構 (ジャーナル と呼びます) で システムメッセージを記録します。これにより、サービスの状態メッセージと、 そのサービスから出力されたメッセージの両方を表示できるようになっています。 また、 status コマンドは tail コマンドに似た動作をするようになっているほか、ログメッセージを様々な 形式で表示することもできます。これにより、便利なデバッグツールとして 利用できるようになっています。

サービスの起動失敗に関する詳細表示

サービスの起動に失敗した場合は、 systemctl status <サービス名>.service のように 実行することで、詳細なエラーメッセージを表示することができます:

www.example.com: ~ # systemctl start apache2.service
Job failed. See system journal and 'systemctl status' for details.
www.example.com: ~ # systemctl status apache2.service
   Loaded: loaded (/lib/systemd/system/apache2.service; disabled)
   Active: failed (Result: exit-code) since Mon, 04 Jun 2012 16:52:26 +0200; 29s ago
   Process: 3088 ExecStart=/usr/sbin/start_apache2 -D SYSTEMD -k start (code=exited, status=1/FAILURE)
   CGroup: name=systemd:/system/apache2.service

Jun 04 16:52:26 g144 start_apache2[3088]: httpd2-prefork: Syntax error on line
205 of /etc/apache2/httpd.conf: Syntax error on li...alHost>
直近 n 行分のサービスメッセージの表示

status サブコマンドは、既定ではサービスが出力した メッセージのうち、直近の 10 行を表示します。表示する行数を変更したい 場合は、 --lines=n パラメータを指定して実行してください:

systemctl status ntp.service
systemctl --lines=20 status ntp.service
追記モードによるサービスメッセージの表示

サービスからのメッセージを リアルタイムに 表示したい 場合は、 --follow オプションを利用します。これは tail -f に似た動作をするものです:

systemctl --follow status ntp.service
メッセージの出力形式の指定

サービスメッセージの出力形式を変更したい場合は、 --output= モード パラメータを指定してください。 主なモードには、下記のようなものがあります:

short

既定の形式です。ログメッセージそのもののほか、人間が読みやすい形式で タイムスタンプが併記されます。

verbose

全ての項目を表示する形式です。

cat

タイムスタンプを併記しない、簡潔な出力形式です。

8.1.3. サービスに対する恒久的な有効化/無効化

上述のサービスの管理コマンドでは、現在動作中のシステムに対するサービスの 操作を行ないます。 systemd では、サービスを恒久的に有効化/無効化し、 必要に応じてシステムの起動時に自動的に開始したり、逆に開始しないように したりすることもできます。これは YaST やコマンドラインからも実施すること ができます。

8.1.3.1. コマンドラインからのサービスの有効化/無効化

下記の表には、 systemd と System V init におけるサービスの有効化/無効化 コマンドを示しています:

[Important]サービスの起動について

コマンドラインからサービスを有効化した場合、動作中のシステムでは サービスが起動されず、次回のシステム起動またはランレベル/ターゲット変更 の際に起動されることに注意してください。有効化した際、即時にサービスを 起動したい場合は、 systemctl start <サービス名>.service または rc<サービス名> start. のように、明示的にサービスを起動してください。

表8.2 サービスの有効化/無効化のコマンド

作業

systemd でのサブコマンド

SysV init でのサブコマンド

有効化

systemctl enable <サービス名>.service

insserv <サービス名>

無効化

systemctl disable <サービス名>.service

insserv -r <サービス名>

確認

サービスが有効に設定されているかどうかを表示します。

systemctl is-enabled <サービス名>.service

n/a

再有効化

サービスを再起動するのと似た仕組みで、このコマンドは いったん無効化した後に有効化します。これはサービスの有効化状態を、 既定値に戻したい場合に利用します。

systemctl reenable <サービス名>.service

n/a

マスク

サービスを 無効化 しても、コマンドラインから 実行することでサービスは起動できてしまいます。サービスを完全に 無効化するには、このようにマスクを設定する必要があります。 注意してお使いください。

systemctl mask <サービス名>.service

n/a

マスク解除

マスクを行なった場合は、マスクを解除することで 再度起動できるようになります。

systemctl unmask <サービス名>.service

n/a


8.1.3.2. YaST を利用したサービスの有効化/無効化

YaST のモジュールを YaST+システム+システムサービス (ランレベル) で起動すると、まずは 簡易モード で表示されます。これは 利用可能な全てのサービスに対して、概要と状態 (詳しくは 図8.1「システムサービス (ランレベル)」 をご覧ください) が表示されるだけの ものです。左側の列にはサービスの名前が、中央の列にはサービスの状態が、右側の列 には短い説明が表示されます。サービスを選択すると、下側により詳しい説明が表示 されます。サービスを有効化するには、表から対象のサービスを選択して 有効にする を選択してください。サービスを無効化する場合も 同様です。

熟練者モード は、ランレベル (詳しくは 8.2.1項 「ターゲットとランレベル」 をお読みください) を詳細に制御する ために使用するモードです。現在の既定のランレベルは、画面上部に表示されます。 通常、 openSUSE システムにおける既定のランレベルは 5 (ネットワークと X Window System を動作させるマルチユーザ環境) です。場合によっては ランレベル 3 (ネットワークを動作させるマルチユーザ環境) が設定されている 場合もあります。

ウインドウ内の表を利用することで、 個別のサービスやデーモンを有効化したり無効化したりすることもできます。 表内には利用可能なサービスやデーモンの一覧が表示され、お使いのシステムで 現在有効化されているかどうかと、どのランレベルに対して有効に設定されて いるかどうかが表示されます。マウスでいずれかの行 (サービスやデーモン) を 選択したあと、ランレベルを表すチェックボックスで設定を行ってください。 また、現在選択されているサービスやデーモンについて、概要説明が表の下に 表示されます。

[Warning]ランレベル設定の誤りによって発生する障害について

ランレベルの設定を誤ると、場合によってはお使いのシステムが利用できなく なってしまいます。設定を適用する前に、どのような影響があるのかを ご確認ください。

図8.1 システムサービス (ランレベル)

システムサービス (ランレベル)

開始/中止/更新 を押すと、サービスを開始したり停止 したりすることができます。 状態を更新 を押すと、現在の 状態を表示することができます。また、 セット/リセット を押すと、行なった変更をシステムに適用したり、ランレベルエディタを起動する 前の設定に戻したりすることができます。 OK を押すと、 変更点をディスクに書き込みます。

8.2. システムの起動とターゲットの管理

システムの起動やシャットダウンに関する全ての処理は、 systemd が管理します。 このような観点からすると、カーネルは他の全てのプロセスを管理するバックグラウンド (裏側の) プロセスであり、他のプログラムが要求する CPU 時間やハードウエア アクセスを調整する仕組みと考えられます。

8.2.1. ターゲットとランレベル

System V init の環境では、システムは ランレベル と呼ばれる 仕組みを利用して起動していました。ランレベルとは、システムやサービスの起動 方法を定義するもので、それぞれ番号を付けて区別していました。よく知られて いるランレベルとしては、 0 (システムのシャットダウン), 3 (ネットワークまでを動作させるマルチユーザ環境), 5 (ネットワークとディスプレイマネージャを動作させる マルチユーザ環境) などがあります。

systemd では、 ターゲットユニット と呼ばれる新しい仕組みを 利用しています (もちろん従来のランレベルの考え方についても、完全な互換性を 備えています) 。ターゲットユニットは、番号ではなく名前で識別する仕組みで、 それぞれ異なる目的を示しています。たとえば local-fs.targetswap.target は、それぞれローカルの ファイルシステムのマウント、スワップ領域のマウントなどを表わします。

graphical.target というターゲットは、ネットワークと ディスプレイマネージャを動作させるマルチユーザ環境で、ランレベル 5 と同じ意味を 持っています。このようなターゲットは メタ ターゲットと呼ばれるもので、他のターゲットをまとめてセットにしたものを 指しています。このように、 systemd は既存のターゲットを組み合わせる ことで、簡単に独自のターゲットを作成できるため、非常に柔軟な運用を行なう ことができます。

下記の表では、 systemd で利用される最も重要なターゲットを示しています。 全てを網羅した表については、 man 7 systemd.special で表示 されるマニュアルページをお読みください。

systemd のターゲットユニット

default.target

システムの起動時に既定で選択されるターゲットです。これは 実在する というよりは、他のターゲット (たとえば graphic.target) に対するシンボリックリンクという意味合いです。このターゲットは YaST から 恒久的に変更することができる (詳しくは 8.1.3.2項 「YaST を利用したサービスの有効化/無効化」 をお読みください) ようになっています。一時的に変更したい場合は、システムの 起動時、カーネルのコマンドラインオプションに systemd.unit=<my_target>.target を指定してください。

emergency.target

コンソール上で非常用のシェルを起動します。システム起動時に systemd.unit=emergency.target のように指定して 利用します。

graphical.target

ネットワークとマルチユーザに対応し、ディスプレイマネージャを起動します。

halt.target

システムをシャットダウンします。

mail-transfer-agent.target

メールの送受信に必要な全てのサービスを起動します。

multi-user.target

ネットワークとマルチユーザに対応した環境を起動します。

reboot.target

システムを再起動します。

rescue.target

ネットワーク機能無しのシングルユーザモードを起動します。

System V init ランレベルデーモンとの互換性を維持する目的で、 systemd では runlevelX.target のような名前のターゲットが用意されています。それぞれ X の部分がランレベルの番号に対応します。

表8.3 System V のランレベルと systemd のターゲットユニット

System V ランレベル

systemd ターゲット

用途

0

runlevel0.target, halt.target, poweroff.target

システムのシャットダウン

1, S

runlevel1.target, rescue.target,

シングルユーザモード

2

runlevel2.target, multi-user.target,

ネットワーク機能無しのマルチユーザ環境

3

runlevel3.target, multi-user.target,

ネットワーク機能のあるマルチユーザ環境

4

runlevel4.target

未使用、または独自に定義して使用するもの

5

runlevel5.target, graphical.target,

ネットワークとディスプレイマネージャを起動するマルチユーザ環境

6

runlevel6.target, reboot.target,

システムの再起動


[Important]systemd における /etc/inittab の有効性について

SysV init のシステムにおけるランレベル管理は /etc/inittab で設定しますが、 systemd では、このファイルに書かれた設定を読み込むことは ありません 。独自のターゲットを作成する方法に ついては、 8.2.2項 「独自のターゲット」 をお読みください。

8.2.1.1. ターゲットの変更を行なうコマンド

下記のコマンドを使用することで、ターゲットユニットを操作することができます:

処理

systemd でのコマンド

SysV init でのコマンド

現在のターゲット/ランレベルの変更

systemctl isolate <my_target>.target

telinit X

既定のターゲット/ランレベルの変更

systemctl default

n/a

現在のターゲット/ランレベルの取得

systemctl list-units --type=target

systemd では通常、複数のターゲットを利用します。そのため、 上記のコマンドは現在有効なターゲットを全て表示します。

who -r

or

runlevel

既定のランレベルに対する恒久的な変更

YaST のランレベルエディタを使用するか、もしくは下記のコマンドを実行する:

ln -sf /lib/systemd/system/<my_target>.target /etc/systemd/system/default.target

YaST のランレベルエディタを使用するか、もしくは /etc/inittab 内の下記の行を変更する:

id:X:initdefault:

システム起動時にランレベルを指定する

システム起動時に、下記のようなオプションを指定する

systemd.unit=<my_target.target>

システム起動時に、ランレベルの番号を指定する

ターゲットやランレベルの依存関係を表示する

systemctl show -p "Requires" <my_target.target>

systemctl show -p "Wants" <my_target.target>

Requires を指定すると、ハード依存関係 (必ず解決されなければ ならない依存関係) を表示します。 Wants を指定すると、 ソフト依存関係 (可能であれば解決されるべき依存関係) を表示します。

n/a

8.2.2. 独自のターゲット

System V init による SUSE システムでは、ランレベル 4 を利用で独自のランレベル 設定を構築できるようになっていました。 systemd では、独自のターゲットを作成 することで、任意の数だけ独自の設定を構築することができます。なお、独自の ターゲットを構築する場合は、 graphical.target など 既存のターゲットに追加する形で構築することをお勧めします。

[Warning]カスタマイズ作業時の注意

systemd のカスタマイズは /etc/systemd ディレクトリ内で 行ない、 /lib/systemd 内では 決して 実施しないでください。後者のディレクトリ内でカスタマイズを行なっても、次回の systemd の更新の際、変更点が上書きされてしまい、元に戻ってしまいます。

手順8.1 独自のターゲットの作成

  1. まずは /lib/systemd/system/graphical.target の設定ファイルを、 /etc/systemd/system/<ターゲット名>.target にコピーします。名前は必要に応じて修正してください。

  2. 以前のステップでコピーした設定ファイルは、既に必須とする (ハード) 依存関係を構築してある状態になっています。可能であれば解決しておくべき 依存関係 (ソフト) を構築したい場合は、 /etc/systemd/system/<ターゲット名>.target.wants という名称のディレクトリを作成してください。

  3. あとは /etc/systemd/system/<ターゲット名>.target.wants ディレクトリ内に、 /lib/systemd/system からのシンボリックリンクを 作成することで、ソフト依存関係を設定することができます。

  4. ターゲットの設定が完了したら、あとは新しいターゲットを利用できるように するため、 systemd に対して設定の再読み込みを指示します:

    systemctl daemon-reload

8.2.3. システム起動に対するデバッグ

systemd には、システムの起動処理を分析できる機能が用意されています。 この機能により、全てのサービスに対する状態を (/var/log を確認する 方法よりは) 便利に確認することができます。また systemd では、起動処理を 調査して、サービスの起動にかかっている時間を調べることもできます。

8.2.3.1. サービスの動作の確認

システムの起動後に開始されたサービスの一覧を確認するには、 systemctl とだけ入力します。すると、下記のように、 有効に設定されている全てのサービスが表示されます。特定のサービスに対して 詳細を読みたい場合は、 systemctl status <サービス名>.service と入力 してください。

例8.1 有効なサービスの一覧表示

jupiter.example.com: ~ # systemctl
UNIT                                LOAD   ACTIVE SUB       JOB DESCRIPTION
[...]
systemd-random-seed-load.path       loaded active waiting       Random Seed
acpid.service                       loaded active running       ACPI Event Daemon
apache2.service                     loaded failed failed        apache
avahi-daemon.service                loaded active running       Avahi mDNS/DNS-SD Stack
bluez-coldplug.service              loaded active exited        LSB: handles udev coldplug of bluetooth dongles
console-kit...-system-start.service loaded active exited        Console System Startup Logging
cron.service                        loaded active running       Command Scheduler
cups.service                        loaded active running       CUPS Printing Service
[...]
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.
JOB    = Pending job for the unit.

107 units listed. Pass --all to see inactive units, too.

起動に失敗したサービスだけを表示したい場合は、 --failed オプションを指定してください:

例8.2 起動に失敗したサービスの表示

jupiter.example.com: ~ # systemctl --failed
UNIT                   LOAD   ACTIVE SUB    JOB DESCRIPTION
apache2.service        loaded failed failed     apache
NetworkManager.service loaded failed failed     Network Manager
plymouth-start.service loaded failed failed     Show Plymouth Boot Screen

[...]

8.2.3.2. サービスの起動時間のデバッグ

システムの起動にかかった時間をデバッグしたい場合、 systemd では systemd-analyze というコマンドが用意されています。 これは全体の起動時間や起動時間順のサービス一覧を表示することができるほか、 他のサービスの起動時間と対比するために利用することのできる、 SVG 画像を 生成することもできます。

システムの起動時間の表示
jupiter.example.com: ~ # systemd-analyze
Startup finished in 2666ms (kernel) + 21961ms (userspace) = 24628ms
システムの起動時間の詳細表示
jupiter.example.com: ~ # systemd-analyze blame
  6472ms systemd-modules-load.service
  5833ms remount-rootfs.service
  4597ms network.service
  4254ms systemd-vconsole-setup.service
  4096ms postfix.service
  2998ms xdm.service
  2483ms localnet.service
  2470ms SuSEfirewall2_init.service
  2189ms avahi-daemon.service
  2120ms systemd-logind.service
  1210ms xinetd.service
  1080ms ntp.service
[...]
    75ms fbset.service
    72ms purge-kernels.service
    47ms dev-vda1.swap
    38ms bluez-coldplug.service
    35ms splash_early.service
サービスの起動時間を表す画像
jupiter.example.com: ~ # systemd-analyze plot > jupiter.example.com-startup.svg

8.2.3.3. Review the Complete Start-Up Process

上述のコマンドを利用することで、サービスの開始とそれにかかる時間を確認する ことができます。さらに詳しい情報を読みたい場合は、 systemd に対して 起動処理に対する冗長ログを採取するように設定します。具体的には、システムの 起動時に、起動パラメータに下記の値を指定します:

systemd.log_level=debug systemd.log_target=kmsg

上記を設定すると、 systemd はログメッセージをカーネルのリングバッファに 書き込むようになります。閲覧の際は dmesg コマンドを ご利用ください:

dmesg | less

8.3. 高度な使い方

下記の章では、システム管理者に対してより高度な作業内容を示しています。 本章よりもさらに高度なドキュメンテーションについては、 Lennart Poettering 氏 による systemd の資料 (http://0pointer.de/blog/projects) (英語) をお読みください。

8.3.1. システムのログ

8.1.2項 「サービスのデバッグ」 では、それぞれの サービスに対してログを閲覧するための方法を示してきましたが、ログメッセージは サービスからのものだけであるとは限りません。 systemd が記録した全てのログ メッセージ (ジャーナル と呼びます) に対するアクセス方法も用意 されています。最も古いログから始まる、全てのログを表示するには、 systemd-journalctl コマンドをお使いください。なお、 フィルタの適用や出力形式の変更について、詳しくは man 1 systemd-journalctl で表示されるマニュアルページをお読みください。

8.3.2. スナップショット

systemd には、現在の状態を名前付きのスナップショットと して保存し、後から isolate サブコマンドでその状態に戻す機能が 用意されています。これは元に戻すことができることから、サービスや独自のターゲットの テストに便利な仕組みです。なお、スナップショットは現在のセッションに対してのみ有効で、 システムを再起動すると自動的に削除されます。また、スナップショットの名前は .snapshot で終わるものでなければなりません。

スナップショットの作成
systemctl snapshot <スナップショット名>.snapshot
スナップショットの削除
systemctl delete <スナップショット名>.snapshot
スナップショットの表示
systemctl show <スナップショット名>.snapshot
スナップショットの有効化
systemctl isolate <スナップショット名>.snapshot

8.3.3. カーネルのコントロールグループ (cgroups)

従来の SysV init システムでは、起動されるサービスに対して、明確なプロセス 設定を行なうことができませんでした。 Apache などのように、サードパーティ製の プロセス (CGI や Java のプロセス) を多数起動し、サードパーティ製のプロセス 自身もプロセスを生成するようなシステムの場合は、プロセスに対する制御を 明示的に行なうことが難しい場合があるほか、場合によっては不可能であることも あります。またそれに加えて、子プロセスを残したまま終了してしまい、結果として サービスが正しく終了しないことも考えられます。

systemd では、そのような問題を cgroups を利用することで解決しています。 cgroups はプロセスをまとめて管理するためのカーネルの機能で、全ての子プロセスを 階層構造で管理します。 systemd では、サービスに対して別々の cgroup を 設定します。非特権プロセスでは cgroup を変えることができないため、サービス から起動したプロセスがどれなのかを、簡単に判別できるようになる、という仕組みです。

サービスに属する全てのプロセスを表示するには、 systemd-cgls コマンドを使用します。実行すると、下記のように (一部省略しています) 表示されます:

例8.3 サービスに属する全プロセスの表示

~ # systemd-cgls --no-pager
├ user
│ └ root
│   └ 1
│     ├ 2279 sshd: root@pts/0
│     ├ 2282 -bash
│     └ 2541 systemd-cgls --no-pager
└ system
  ├ 1 /sbin/init splash showopts
  ├ apache2.service
  │ ├ 2535 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D SYSTEMD -k start
  │ ├ 2536 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D SYSTEMD -k start
  │ ├ 2537 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D SYSTEMD -k start
  │ ├ 2538 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D SYSTEMD -k start
  │ ├ 2539 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D SYSTEMD -k start
  │ └ 2540 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D SYSTEMD -k start
  ├ xdm.service
  │ ├ 2250 /usr/bin/xdm
  │ ├ 2253 /usr/bin/X -nolisten tcp -br vt7 -auth /var/lib/xdm/authdir/authfiles/A:0-ii8Goo
  │ ├ 2263 -:0         
  │ └ 2276 /usr/bin/xconsole -notify -nostdin -verbose -exitOnFail
  ├ ntp.service
  │ └ 2202 /usr/sbin/ntpd -p /var/run/ntp/ntpd.pid -g -u ntp:ntp -c /etc/ntp.conf
  ├ sshd.service
  │ └ 1743 /usr/sbin/sshd -D
    

cgroups について、詳しくは 第10章 カーネルのコントロールグループ (↑システム分析とチューニングガイド) をお読みください。

8.3.4. サービスの kill (シグナルの送信)

8.3.3項 「カーネルのコントロールグループ (cgroups)」 で説明したとおり、 SysV init のシステムでは親プロセスを判断することが不可能になってしまうことがありました。 このような状態になってしまうと、サービスから起動された多数のプロセスがわからなく なってしまい、子プロセスはゾンビプロセスとして残ってしまいます。

systemd の cgroups 管理の仕組みにより、サービスから起動された子プロセスを 容易に判別し、それらに対してまとめてシグナルを送信することができます。 サービスに対してシグナルを送信する場合は、 systemctl kill コマンドをお使いください。利用可能なシグナルの一覧は、 man 7 signals コマンドで表示することができます。

サービスに対する SIGTERM の送信

SIGTERM は、シグナルを送信する際の既定のシグナルです。

systemctl kill <サービス名>.service
サービスに対する SIGNAL の送信

-s オプションを利用することで、送信するシグナルを指定すること ができます。

systemctl kill -s SIGNAL <サービス名>.service
プロセスの選択

既定では、 kill コマンドは指定した cgroup 内の all (全ての) プロセスに対してシグナルを送信します。 systemd では、 control (制御) または main (メイン) のプロセスに対してだけ送信することもできます。 後者の場合は、特に SIGHUP を送信して設定を 再読み込みさせるような場合に有効です:

systemctl kill -s SIGHUP --kill-who=main <サービス名>.service

8.4. さになる情報

systemd に対してさらに詳しい情報をご希望の場合は、下記のオンラインリソースを お読みください (いずれも英語です):

Web ページ

http://www.freedesktop.org/wiki/Software/systemd

systemd for Administrators

systemd の著者のうちの 1 人、 Lennart Pottering 氏によるブログにも、 詳しい説明が書かれています。本章記述時点では 13 個の投稿があります。 http://0pointer.de/blog/projects からお読みください。

Control Centre: The systemd Linux init system

http://www.h-online.com/open/features/Control-Centre-The-systemd-Linux-init-system-1565543.html

Booting up: Tools and tips for systemd, a Linux init tool

http://www.h-online.com/open/features/Booting-up-Tools-and-tips-for-systemd-1570630.html


openSUSE リファレンス 13.1