
systemdデーモン
プログラムsystemdは、プロセスID 1のプロセスであり、要求された方法でシステムを初期化します。systemdはカーネルによって直接起動され、通常はプロセスを強制終了するシグナル9が使えないようにします。他のすべてのプログラムは、systemdまたは子プロセスのいずれかによって直接起動されます。
SUSE Linux Enterprise Desktop 12から、一般的なSystem V initデーモンがsystemdに置き代わりました。systemdは、System V initと完全な互換性があります(initスクリプトをサポートしているため)。systemdの主な利点の1つは、サービスを積極的に並行起動することで、ブート時間をかなり速くできることです。systemdは、サービスを必要なときだけ起動します。デーモンは、ブート時に無条件で起動されることはなく、最初に必要になったときに起動されます。systemdでは、カーネルのコントロールグループ(cgroup)もサポートしているほか、システムの状態をスナップショットに保存したり、その状態に復元したりすることもできます。詳細については、http://www.freedesktop.org/wiki/Software/systemd/を参照してください。
このセクションでは、systemdの背景にある概念について詳しく説明します。
systemdは、System VおよびLSBのinitスクリプトと互換性のある、Linux向けのシステム/セッションマネージャです。 主な特長は次のとおりです。
積極的な並行機能の提供
ソケットやD-Busアクティベーションを使用したサービスの起動
デーモンのオンデマンド起動
Linux cgroupsを使用したプロセスの追跡
システム状態のスナップショットへの保存、およびその状態への復元
マウントポイントと自動マウントポイントの保持
精巧なトランザクションの依存関係に基づくサービス制御ロジックの実装
ユニット設定ファイルには、サービス、ソケット、デバイス、マウントポイント、自動マウントポイント、スワップファイルやパーティション、起動ターゲット、監視対象のファイルシステムのパス、systemdによって制御および監視されているタイマ、一時的なシステム状態のスナップショット、リソース管理スライス、または外部で作成されたプロセスグループに関する情報がエンコーディングされます。「ユニットファイル」は、systemdの次のファイルの総称です。
サービス. プロセスに関する情報(たとえば、実行中のデーモン)。サービスファイルは.serviceで終わります。
ターゲット. システム起動時のユニットのグループ化に、または同期ポイントとして使用されます。ターゲットファイルは.targetで終わります。
ソケット.
ソケットに基づくアクティベーション(inetdなど)でのIPC、ネットワークソケット、ファイルシステムFIFOに関する情報。ソケットファイルは.socketで終わります。
パス. その他のユニットをトリガするために使用されます(たとえば、ファイル変更時のサービスの実行など)。パスファイルは.pathで終わります。
タイマ. タイマ制御された、タイマに基づくアクティベーションに関する情報。タイマファイルは.timerで終わります。
マウントポイント. 通常はfstabジェネレータによって自動生成されます。マウントポイントファイルは.mountで終わります。
自動マウントポイント. ファイルシステムの自動マウントポイントに関する情報。自動マウントポイントファイルは.automountで終わります。
スワップ. スワップデバイスに関する情報またはメモリページング用のファイル。スワップファイルは.swapで終わります。
デバイス. sysfs/udev(7)デバイスツリーに公開されているデバイスユニットに関する情報。デバイスファイルは.deviceで終わります。
スコープ/スライス. プロセスグループのリソースを階層管理する際の概念。スコープ/スライスファイルは.scope/.sliceで終わります。
systemd.unitの詳細については、http://www.freedesktop.org/software/systemd/man/systemd.unit.htmlを参照してください。
System V initシステムでは、initスクリプト、insserv、telinitなどの複数の異なるコマンドを使用してサービスを処理します。systemdでは、サービスに対する主な処理を実行する際、1 つのコマンド(systemctl)で済むようになっているため、サービスをより容易に管理できます。gitやzypperのように、「コマンドの後ろにサブコマンド」を指定して実行します。
systemctl [general OPTIONS] subcommand [subcommand OPTIONS]
完全なマニュアルについては、man 1 systemctlを参照してください。
systemdのコマンドは、出力先が端末である場合(パイプやファイルなどではない場合)、デフォルトではページャに長い出力が送信されます。ページングモードをオフにするには、--no-pagerオプションを使用してください。
systemdでは、bashによる補完もサポートしています。サブコマンドの最初の1文字を入力し、<Tab>を押すと、サブコマンドの残りを自動的に入力することができます。この機能は、bashシェルを利用している場合にのみ使用できるもので、bash-completionパッケージをインストールしておく必要があります。
サービスを管理するためのサブコマンドは、 System V initでのサービス管理コマンドと同じ(start、 stopなど)です。 サービス管理コマンドの基本構文は、以下のとおりです。
systemctl reload|restart|start|status|stop|... <my_service(s)>.service
rc<my_service(s)> reload|restart|start|status|stop|...
systemdでは、複数のサービスを一括で管理できます。initスクリプトを次々と実行しなければならないSystem V initとは異なり、次のようにコマンドを実行します。
systemctl start <my_1st_service>.service <my_2nd_service>.service
システムで利用できるすべてのサービスを一覧表示するには、次のように実行します。
systemctl list-unit-files --type=service
次の表に、systemdとSystem V initの最も重要なサービス管理コマンドを示します。
|
タスク |
systemdコマンド |
System V initコマンド |
|---|---|---|
|
起動. |
start |
start |
|
停止. |
stop |
stop |
|
再起動. サービスを停止し、後で起動します。サービスがまだ起動していない場合は、そのサービスを起動します。 |
restart |
restart |
|
条件付きの再起動. サービスが現在実行中の場合、サービスを再起動します。実行されていないサービスについては、何も行いません。 |
try-restart |
try-restart |
|
再ロード.
サービスに対し、操作を中断せずに設定ファイルを再ロードするように指示します。Apacheに、変更後の |
reload |
reload |
|
再ロードまたは再起動. サービスが再ロードをサポートしていれば再ロードし、サポートしていなければ再起動します。サービスがまだ起動していない場合は、そのサービスを起動します。 |
reload-or-restart |
n/a |
|
条件付きの再ロードまたは再起動. サービスが再ロードをサポートしていれば再ロードし、サポートしていなければ再起動します(現在実行中の場合)。実行されていないサービスについては、何も行いません。 |
reload-or-try-restart |
n/a |
|
詳細なステータス情報の取得.
サービスのステータスについて、情報を表示します。 |
status |
status |
|
簡潔なステータス情報の取得. サービスがアクティブかどうかを示します。 |
is-active |
status |
上述のサービス管理コマンドでは、現在のセッションに対するサービスを操作できます。systemdでは、サービスを恒久的に有効化/無効化して、必要に応じて自動的に起動したり、常に使用不可にすることもできます。この作業は、YaSTまたはコマンドラインを使用して実行できます。
次の表に、systemdとSystem V initの有効化/無効化コマンドを示します。
コマンドラインからサービスを有効化した場合、そのサービスは自動的には起動されず、次回のシステム起動またはランレベル/ターゲット変更の際に起動されます。有効化した後で、即時にサービスを起動するには、systemctl start <my_service>.service またはrc<my_service> startのように、明示的にサービスを起動してください。
|
作業 |
|
System V initコマンド |
|---|---|---|
|
有効化. |
|
|
|
無効化. |
|
|
|
確認. サービスが有効になっているかどうかを示します。 |
|
該当なし |
|
再有効化. サービスの再起動と同様に、このコマンドはいったんサービスを無効化した後に有効化します。サービスにデフォルト値を設定して再有効化する場合に利用します。 |
|
該当なし |
|
マスク. サービスを「無効化」しても、手動で起動できてしまいます。サービスを完全に無効化するには、マスクを設定する必要があります。 注意してご使用ください。 |
|
該当なし |
|
マスク解除. マスクを設定したサービスは、マスクを解除しないと使用できません。 |
|
該当なし |
システムを起動し、シャットダウンするプロセス全体は、systemdによって管理されます。この見地から、カーネルは、他のプログラムからの要求に従って、他のすべてのプロセスを保持し、CPU時間とハードウェアアクセスを調整するバックグラウンドプロセスと考えることができます。
System V initでは、システムは「ランレベル」と呼ばれる状態でブートしていました。ランレベルはシステムの起動方法および稼働中のシステムで使用可能なサービスを定義します。ランレベルは番号付けされています。よく知られているランレベルは、0 (システムのシャットダウン)、3 (ネットワークを使用するマルチユーザシステム)、および5 (ネットワークとディスプレイマネージャを使用するマルチユーザシステム)です。
systemdでは、「ターゲットユニット」と呼ばれる仕組みを使用する新しい概念が導入されています。ただし、ランレベルの概念とも、完全な互換性を維持しています。ターゲットユニットには、番号ではなく名前が付けられており、特定の目的を果たします。たとえば、ターゲットlocal-fs.targetやswap.target は、それぞれローカルファイルシステムのマウントと、スワップ領域のマウントを実行します。
ターゲットgraphical.targetは、ネットワーク機能とディスプレイマネージャ機能を使用するマルチユーザシステムで、ランレベル5に相当します。 graphical.targetなどの複合ターゲットは、他のターゲットのサブセットを組み合わせることで、「メタ」ターゲットとして機能します。systemdでは、既存のターゲットを組み合わせることで簡単にカスタムターゲットを作成できるため、非常に柔軟な運用が実現されます。
次のリストは、systemdの最も重要なターゲットユニットを示しています。すべてを網羅したリストについては、man 7 systemd.specialを参照してください。
default.target
デフォルトで起動されるターゲット。「実在する」ターゲットというよりは、別のターゲット(graphic.targetなど)に対するシンボリックリンクであるといえます。YaSTを介して恒久的に変更できます(11.4項 「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の部分がランレベルの番号に対応します。
現在のターゲットを知りたい場合は、systemctl get-defaultコマンドを使用します。
systemdのターゲットユニット #|
System Vランレベル |
|
用途 |
|---|---|---|
|
0 |
|
システムのシャットダウン |
|
1、S |
|
シングルユーザモード |
|
2 |
|
リモートネットワークなしのローカルマルチユーザ |
|
3 |
|
ネットワークを使用するフルマルチユーザ |
|
4 |
|
未使用/ユーザ定義 |
|
5 |
|
ネットワークとディスプレイマネージャを使用するフルマルチユーザ |
|
6 |
|
システムの再起動 |
/etc/inittabが無視されることについて
System V initシステムのランレベルは、/etc/inittabで設定されています。 systemdでは、この設定が使用されることはありません。独自のブート可能なターゲットを作成する方法については、11.5.3項 「カスタムターゲットの作成」を参照してください。
次のコマンドを使用して、ターゲットユニットを操作します。
|
作業 |
systemdコマンド |
System V initコマンド |
|---|---|---|
|
現在のターゲット/ランレベルの変更 |
|
|
|
デフォルトのターゲット/ランレベルへの変更 |
|
該当なし |
|
現在のターゲット/ランレベルの取得 |
systemdでは通常、複数のアクティブターゲットを利用します。そのため、このコマンドは現在アクティブなターゲットをすべて表示します。 |
または
|
|
デフォルトのランレベルの恒久的な変更 |
サービスマネージャを使用するか、次のコマンドを実行します。
|
サービスマネージャを使用するか、次の行を変更します。
( |
|
現在のブートプロセスに対するデフォルトランレベルの変更 |
ブートプロンプトで次のオプションを入力します。
|
ブートプロンプトで必要なランレベルの番号を入力します。 |
|
ターゲットやランレベルの依存関係の表示 |
「Requires」を指定すると、ハード依存関係(必ず解決する必要がある依存関係)が表示されます。「Wants」を指定すると、ソフト依存関係(可能であれば解決される依存関係)が表示されます。 |
該当なし |
systemdには、システム起動プロセスを分析できる機能が用意されています。この機能により、全サービスのリストとそのステータスを(/varlog/を解析する方法よりは)便利に確認することができます。systemdでは、起動手順を精査して、サービスの起動にかかっている時間を調べることもできます。
システムのブート後に起動された全サービスのリストを確認するには、systemctlと入力します。次のように、すべてのアクティブなサービスが表示されます (一部省略しています)。特定のサービスの詳細情報が必要な場合は、systemctl status <my_service>.serviceと入力してください。
root # 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オプションを指定してください。
root # 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
[...]
システムの起動時間をデバッグするために、systemdでは、systemd-analyzeコマンドが用意されています。このコマンドでは、全体の起動時間や起動時間順のサービス一覧を表示できるほか、他のサービスの起動時間と対比するために利用できる、SVG画像を生成することもできます。
root # systemd-analyze
Startup finished in 2666ms (kernel) + 21961ms (userspace) = 24628msroot # 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.serviceroot # systemd-analyze plot > jupiter.example.com-startup.svg
上述のコマンドを利用することで、起動したサービスと起動にかかった時間を確認できます。さらに詳しい情報が必要な場合は、ブートプロンプトで次のパラメータを入力することにより、systemdに対して、起動手順全体の冗長ログを記録するように指示できます。
systemd.log_level=debug systemd.log_target=kmsg
systemdが、ログメッセージをカーネルのリングバッファに書き込むようになります。バッファを閲覧するには、dmesgを使用してください。
dmesg -T | less
SystemdはSystem Vと互換性があるため、引き続き既存のSystem V initスクリプトを使用できます。ただし、そのままではSystemdでSystem V initスクリプトを使用できない既知の問題が少なくとも1つあります。initスクリプトでsuまたはsudoを使用して別のユーザとしてサービスを起動すると、スクリプトエラーになり、「」「アクセス拒否」エラーが生成されます。
suまたはsudoを使用してユーザを変更すると、PAMセッションが開始されます。このセッションは、initスクリプトが完了すると終了します。その結果、initスクリプトで起動されたサービスも終了します。このエラーを回避するには、次の手順に従います。
initスクリプトと同じ名前を持ち、ファイル名拡張子.serviceが付くサービスファイルラッパーを作成します。
[Unit] Description=DESCRIPTION After=network.target [Service] User=USER Type=forking1 PIDFile=PATH TO PID FILE1 ExecStart=PATH TO INIT SCRIPT start ExecStop=PATH TO INIT SCRIPT stop ExecStopPost=/usr/bin/rm -f PATH TO PID FILE1 [Install] WantedBy=multi-user.target2
大文字で記述されている値はすべて適切な値に置き換えてください。
systemctl start APPLICATION.serviceでデーモンを起動します。
基本的なサービス管理は、YaSTサービスマネージャモジュールで行うこともできます。このモジュールは、サービスの起動、停止、有効化、および無効化をサポートしています。サービスのステータスを表示したり、デフォルトのターゲットを変更することもできます。 › › の順に選択して、YaSTモジュールを起動します。
システムのブート先になるターゲットを変更するには、ドロップダウンボックスからターゲットを選択します。最もよく使用されているターゲットは、(グラフィカルなログイン画面を起動する)と(コマンドラインモードでシステムを起動する)です。
テーブルからサービスを選択します。列は、現在サービスが実行されているかどうかを示します(か、かを示します)。ステータスを切り替えるには、を選択します。
サービスを起動または停止すると、現在実行されているセッションのステータスが変更されます。再起動時にステータスを変更するには、サービスを有効化または無効化する必要があります。
テーブルからサービスを選択します。有効化列は、現在サービスが「有効化」されているか、それとも「無効化」されているかを示します。ステータスを切り替えるには、を選択します。
サービスを有効化/無効化することにより、サービスがブート時に起動されるかどうか(「有効化」)または「無効化」)を設定できます。この設定は、現在のセッションには影響しません。現在のセッションにおけるサービスのステータスを変更するには、サービスを起動または停止する必要があります。
サービスのステータスメッセージを表示するには、リストからサービスを選択し、を選択します。表示される内容は、コマンドsystemctl で生成されたものと同じです。
-l status <my_service>
ランレベルの設定が誤っていると、システムを使用できなくなることがあります。変更を実際に適用する前に、どういう結果が出るかをよく確認してください。
systemdのカスタマイズ #
次のセクションには、systemdのカスタマイズ例が示されています。
systemdのカスタマイズは/etc/systemd/で行ってください。/usr/lib/systemd/では、絶対に行わないでください。そうしないと、systemdの次回の更新によって、変更内容が上書きされてしまいます。
systemdサービスファイルは、/usr/lib/systemd/systemにあります。サービスファイルをカスタマイズする場合は、次の手順に従います。
変更対象のファイルを/usr/lib/systemd/systemから/etc/systemd/systemにコピーします。ファイル名は、元の名前のまま残します。
/etc/systemd/systemのコピーを適宜変更します。
設定変更の概要を表示するには、systemd-deltaコマンドを使用します。このコマンドを使用すると、他の設定ファイルを上書きする設定ファイルを特定したり、複数の設定ファイルを比較対照することができます。詳細については、systemd-deltaマニュアルページを参照してください。
ファイル名が同じ場合、/etc/systemdにある変更済みファイルが、/usr/lib/systemd/systemにある元のファイルよりも優先的に使用されます。
設定ファイルに何行かを追加したり、設定ファイルのごく一部を変更するには、「ドロップイン」と呼ばれるファイルを使用します。ドロップインファイルを使用すると、ユニットファイルの設定を拡張できます。その際に、ユニットファイル自体は編集も上書きもされません。
たとえば、/usr/lib/systemd/system/ foobar.serviceにあるfoobarサービスの1つの値を変更するには、次の手順に従います。
/etc/systemd/system/<my_service>.service.d/というディレクトリを作成します。
.dサフィックスが付いていることに注意してください。それ以外の点では、このディレクトリは、ドロップインファイルでパッチ適用するサービスと同じ名前になります。
ディレクトリ内に、whatevermodification.confファイルを作成します。
このファイルには、変更する値が設定されている行のみを含めます。
ファイルに変更内容を保存します。このファイルは、元のファイルへの拡張として使用されます。
System V init SUSEシステムでは、管理者が独自のランレベル設定を作成できるように、ランレベル4は使用されていません。systemdでは、任意の数のカスタムターゲットを作成できます。ターゲットの作成は、graphical.targetなどの既存のターゲットを改変することから始めることをお勧めします。
設定ファイル/usr/lib/systemd/system/graphical.targetを/etc/systemd/system/<my_target>.targetにコピーして、必要に応じて修正してください。
前のステップでコピーした設定ファイルは、すでにターゲットの必須な(「ハード」)依存関係を構築した状態になっています。希望する(「ソフト」)依存関係も構築するには、/etc/systemd/system/<my_target>.target.wantsディレクトリを作成します。
希望するサービスごとに、/usr/lib/systemd/systemから/etc/systemd/system/<my_target>.target.wantsへのシンボリックリンクを作成します。
ターゲットの設定が完了したら、新しいターゲットを利用できるようにするために、systemdの設定を再ロードします。
systemctl daemon-reload
次のセクションでは、システム管理者向けの高度なトピックについて説明します。さらに高度なsystemdのドキュメントについては、Lennart Pöttering氏によるsystemdの資料(http://0pointer.de/blog/projects)を参照してください。
11.6.6項 「サービスのデバッグ」には、特定のサービスに対するログメッセージを閲覧する方法が説明されていますが、表示されるログメッセージは、サービスログからのものだけであるとは限りません。systemdが記録したすべてのログメッセージ(「」「ジャーナル」と呼ばれる)にアクセスして問い合わせることもできます。最も古いログから始めて、すべてのログを表示するには、systemd-journalctlコマンドを使用します。フィルタの適用や出力形式の変更については、man 1 systemd-journalctlを参照してください。
systemdの現在の状態を名前付きのスナップショットに保存し、後でisolateサブコマンドを使用してその状態に戻ることができます。定義した状態にいつでも戻ることができるため、サービスやカスタムターゲットをテストする際に便利です。スナップショットは現在のセッションでのみ使用可能で、システムを再起動すると自動的に削除されます。スナップショットの名前は、.snapshotで終わる必要があります。
systemctl snapshot <my_snapshot>.snapshot
systemctl delete <my_snapshot>.snapshot
systemctl show <my_snapshot>.snapshot
systemctl isolate <my_snapshot>.snapshot
systemdにより、次の場所にある環境設定ファイルを使用してブート時に自動的にカーネルモジュールをロードできます。
/usr/lib/modules-load.dおよび
/etc/modules-load.d
詳細については、modules-load.d(5)のマニュアルページを参照してください。
従来のSystem V initシステムでは、特定のプロセスを、その生成元のサービスに対して明確に割り当てられないことがありました。Apacheなどの一部のサービスは、サードパーティのプロセス(CGIやJavaのプロセス)を多数生成し、サードパーティのプロセス自体もさらにプロセスを生成します。サービスに対する明確な割り当ては難しいことがあるだけでなく、場合によっては不可能であることもあります。一部の子プロセスを残して、サービスが正しく終了しないことも考えられます。
systemdでは、各プロセスを独自のcgroupに配置することでこの問題を解決しています。cgroupはプロセスをまとめるためのカーネルの機能で、すべての子プロセスを階層構造のグループとして管理します。systemdでは、各cgroupにそのサービスの名前が付けられています。非特権プロセスではcgroupから「離脱」できないため、サービスから生成したプロセスがどれなのかをサービス名によって判別できる効果的な仕組みです。
サービスに属するすべてのプロセスを表示するには、systemd-cglsコマンドを使用します。次の例のような結果になります(一部省略しています)。
root # systemd-cgls --no-pager
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 20
├─user.slice
│ └─user-1000.slice
│ ├─session-102.scope
│ │ ├─12426 gdm-session-worker [pam/gdm-password]
│ │ ├─15831 gdm-session-worker [pam/gdm-password]
│ │ ├─15839 gdm-session-worker [pam/gdm-password]
│ │ ├─15858 /usr/lib/gnome-terminal-server
[...]
└─system.slice
├─systemd-hostnamed.service
│ └─17616 /usr/lib/systemd/systemd-hostnamed
├─cron.service
│ └─1689 /usr/sbin/cron -n
├─ntpd.service
│ └─1328 /usr/sbin/ntpd -p /var/run/ntp/ntpd.pid -g -u ntp:ntp -c /etc/ntp.conf
├─postfix.service
│ ├─ 1676 /usr/lib/postfix/master -w
│ ├─ 1679 qmgr -l -t fifo -u
│ └─15590 pickup -l -t fifo -u
├─sshd.service
│ └─1436 /usr/sbin/sshd -D
[...]cgroupの詳細については、Chapter 8, Kernel Control Groups, System Analysis and Tuning Guideを参照してください。
11.6.4項 「カーネルのコントロールグループ(cgroup)」で説明したとおり、System V initのシステムでは、プロセスをその親サービスプロセスに割り当てることができないことがあります。そのため、サービスとそのすべての子プロセスを終了するのが難しくなります。終了されていない子プロセスは、ゾンビプロセスとして残ってしまいます。
各サービスをcgroupに範囲制約するという、systemdの概念を採用することで、サービスのすべての子プロセスを明確に判別し、それら各プロセスに対してシグナルを送信できます。サービスに対してシグナルを送信する場合は、systemctl killコマンドを使用します。使用可能なシグナルの一覧については、man 7 signalsを参照してください。
SIGTERMの送信
SIGTERMは、送信されるデフォルトのシグナルです。
systemctl kill <my_service>.service
-sオプションを使用することで、送信するシグナルを指定できます。
systemctl kill -s SIGNAL <my_service>.service
デフォルトでは、killコマンドは、指定したcgroup内のall (すべての)プロセスに対してシグナルを送信します。control (制御)またはmain (メイン)のプロセスに対してだけ送信することもできます。限定されたプロセスに対する送信は、SIGHUPを送信して設定を再ロードさせるような場合に有効です。
systemctl kill -s SIGHUP --kill-who=main <my_service>.service
デフォルトでは、systemdは過剰に冗長な出力を行いません。サービスの起動が成功した場合は何も出力されず、失敗した場合は短いエラーメッセージが表示されます。サービスの起動や操作をデバッグする場合は、systemctl statusコマンドを使用してください。
systemdは、独自のログ機構(「ジャーナル」)でシステムメッセージを記録します。これにより、サービスメッセージとステータスメッセージを両方とも表示できます。statusコマンドはtailコマンドに似た動作をするほか、ログメッセージをさまざまな形式で表示することもできます。これにより、強力なデバッグツールとして利用できるようになっています。
サービスの起動に失敗した場合は、systemctl status <my_service>.serviceを実行することで、詳細なエラーメッセージを表示することができます。
root #systemctl start apache2.service Job failed. See system journal and 'systemctl status' for details.root #systemctl status apache2.service Loaded: loaded (/usr/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>
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
タイムスタンプを併記しない、簡潔な出力。
systemdの詳細については、次のオンラインリソースを参照してください。
systemdの著者のうちの1人、Lennart Pöttering氏によるブログに、systemdに関する複数の投稿があります(本章記述時点では13個の投稿)。それらは、次のサイトに記載されています。http://0pointer.de/blog/projects
systemd Linux init systemhttp://www.h-online.com/open/features/Control-Centre-The-systemd-Linux-init-system-1565543.html
http://www.h-online.com/open/features/Booting-up-Tools-and-tips-for-systemd-1570630.html