• Windows Subsystem for Linuxガイド 第19回 systemd コマンド編

systemdの基本的な操作はsystemctlコマンドで行なう。ログの表示や管理に関しては、journalctlというコマンドを使う。

systemdが動作している環境では、シャットダウンやスリープといった動作もsystemd経由で行なう。ただし、自動的に既存のコマンド(shutdownなど)がsystemctlへのリンクに書き換わっているため、ユーザーはコマンドを変える必要はない。しかし、多くのことがsystemdで管理されていることは理解しておいたほうがいい。

systemdの基本的な部分に関しては、前回記事「systemd 基本編」を参照されたい。

systemctlコマンド

systemctlコマンドは、


systemctl␣<コマンド>␣[パラメーター|オプション]……

という構文で利用する。

コマンドは、基本的な操作を指定し、それにパラメーターやオプションが続く。詳細に関しては、manページを参照いただきたい。また、インターネットにはさまざまな解説記事もあれば、書籍もある。systemdは、広範囲な機能を持つが、まずは、状態を確認できるようになるのが先決だろう。

ユニット状態の表示

状態確認のためのコマンド(表01)の1つが、“list-units”で、これは、systemdが認識しているユニットを表示するものだ。なお、表は、状態を表示するための簡易な書式のみを掲載している。正確な書式などに関しては、manページなどを参照いただきたい。

  • ■表01

ただし、このコマンドだけでは、大量の表示が出てしまい、目的のユニットを探すのが難しい。まずは、必要な情報のみを表示させる方法を理解しよう。

もし、ユニット名やその一部が分かっているなら、前記のコマンドの後ろにワイルドカードを使ったパターンを記述することで、目的のユニットだけを表示できる。たとえば、ユニット名の先頭に“network”や“Network”が含まれている場合、“[Nn]etwork*”あるいは“?etwork*”というパターンを指定する(写真01)。


systemctl list-units [Nn]etwork*
  • 写真01: list-unitsコマンドは、パターン指定でユニットを限定することができる。このパターンは、bashのファイル名展開とほぼ同じもの

このパターン指定は、bashのファイル名展開と同じで、ワイルドカードの“*”または“?”と角括弧による文字の指定からなる。このため、上記のパターンは、“?etwork*”とすることも可能だ。パターンの一致は前方一致で行なわれるため、ユニット名の途中が「Network」であるなら、前にアステリスクを付け“*[Nn]etwork*”とする。

名前が不明なときに出力されるユニットを限定する方法の1つがタイプの指定だ。ユニットのタイプを特定するには、“--type”オプションを使う(写真02)。


systemctl list-units --type=service
  • 写真02: “--type”オプションを使うことで、表示するユニットの種類(別表参照)を指定することができる

このオプションの引数には、(表02)にあるユニットの種別を記述する。

  • ■表02

このほかに、ユニットの実行状態を指定して、出力を限定する方法もある。その場合には、“--state”を使う(写真03)。


systemctl list-units --state=not-found
  • 写真03: “--state”オプションを使えば、特定の状態を持つユニットのみを表示させることができる

こうしたオプションの引数に何を指定できるのかは、引数として“help”を指定すると、指定可能な候補を表示する。このときサブコマンドは実行されない(写真04)。もちろん、“--help”でヘルプメッセージを表示する。


systemctl list-units --type=help
  • 写真04: パラメーターを指定するオプションに引数として“help”を渡すと指定可能な引数を表示してくれる

list-unitsコマンドでは、4つのフィールドを表示する(写真05)。“UNIT”は、ユニットが記述されたユニットファイル名、“LOAD”はユニットファイルが読み込まれているかどうかを示す。“ACTIVE”はユニットの状態(state)の一般的な状態、“SUB”は、詳細な状態を示し、“DESCRIPTION”は、ユニットファイルに記述されている説明である。エラーなどが起こった場合には、色付きで表示されるので比較的見つけやすい。

  • 写真05: list-unitsの出力は「UNIT」、「LOAD」、「ACTIVE」、「SUB」、「DESCRIPTION」の5つのフィールドを持つ。このうち「LOAD」、「ACTIVE」、「SUB」が状態(STATE)にあたる

なお、list-unitsコマンドは、基本的に読み込まれた状態、“LOAD”が“loaded”のものだけを表示する。なんらかの理由で、読み込まれていないコマンドを含めるには、“--all”オプションを指定する。


systemctl list-units --type=service --all

ユニットファイルの情報を得る

ユニットは、ユニットファイルを読み込んだのちに実行される。ユニットファイルは、ユニットというオブジェクトをメモリ内に構築するための設定情報である。ユニットファイルが読み込まれるとユニットとなる。

このため、ユニットの有効無効は、ユニットファイルに対して行なう。また、ユニットの設定を切り替えるには、ユニットファイルに対して操作を行なうが、systemdでは、極力ユニットファイル自体を直接扱わなくてもいいようにコマンドを用意している。これは、systemd自体がユニットファイルを操作しているため、ユーザーがユニットファイルを直接操作すると、systemdが正しく動作できなくなる可能性があるからだ。

各ユニットファイルの状態などを調べるには、list-unit-filesコマンドを使う。このコマンドでも大量のユニットファイルが表示されるが、これらを制限するのに、list-unitsと同じく--typeや--stateオプションが利用できる。

list-unit-filesコマンドの出力(写真06)は、3つのフィールドかある。それぞれ、ユニットの名前である“UNIT FILE”、ユニットファイルの状態を表わす“STATE”、そしてディストリビューション・ベンダーの設定値である“VENDOR PRESET”となっている。

  • 写真06: list-unit-filesコマンドは、systemdが認識しているユニットファイルを表示する。STATEは、ユニットファイルの状態、VENDOR PRESETは、ディストリビューション・ベンダーが指定した標準設定値

ユニットファイルが存在する場合、catコマンドでファイル内容を表示させることができる(写真07)。ユニットファイルには、ユニットに関する情報が記述されており、その大半は、プロパティ設定になっている。具体的にはユニットファイル中で「プロパティ=設定値」という定義が続く。ただし、ユニットの中には自動生成されたユニットファイルが存在しないユニットもあるため、catコマンドで出力できない場合がある。

  • 写真07: catコマンドは、存在すれば、指定したユニットファイルを表示する。これに対して、showコマンドは、メモリ中にあるユニットのプロパティ値を表示する。プロパティ値の中には、ユニットファイルで指定されたものが含まれている

似たようなコマンドにshowがある。このコマンドは、ユニットの持つプロパティを表示するものだ。メモリに読み込まれたユニットファイルは、ユニット「オブジェクト」としてさまざまなプロパティを持つ。ユニットファイルに記述してある内容もプロパティの一部になっているが、プロパティには起動した時刻、現在状態などの状態値に加え、ユニットファイルで省略されている設定値などもあり、多くの場合、catコマンドよりも多くの情報が表示される。

catコマンドでユニットファイルが表示されない場合でも、showコマンドでユニットが持つプロパティを表示できる。

その他の状態表示コマンド

特定のユニットに関して、詳細な情報を得たいときには、statusコマンドを使う。パラメーターとしてユニット名(パターン可)を指定すれば、該当ユニットの現在の状態やログの最近の部分を表示する(写真08)。これは、エラーのあるユニットの状態表示などに利用することが多い。

  • 写真08: statusコマンドは、ユニットの現在状態を表示する。このとき、エラーなどがあれば、関連するログの表示も行なう

また、ユニットの依存関係を調べるには、list-dependenciesコマンドを使う。ただし、このコマンドが有効なのは、メモリに読み込まれているユニットのみである点に注意が必要だ。また、他のコマンドと違って、ユニット名をパターンで指定できず、ユニット名を省略せずに指定しなければならない。

このコマンドには、(表03)のようなオプションがある。これらを使うことで、特定のユニットの依存関係を把握することが可能だ。

  • ■表03

ユニットの操作

有効になったユニットからデーモンプロセスなどが起動されるが、こうした処理を再度実行させたい場合や、一時的に停止させたい場合がある。こうした場合にはユニット操作のコマンドを使う(表04)。このコマンドによる操作はあくまでも一時的なもので、Linuxの再起動によりユニットは標準状態に復帰する。

  • ■表04

多くの場合、こうしたコマンドは、ユニットや依存関係にあるユニットの編集などのあとに行なったり、ユニットが起動する処理のエラー時に行なう。一部のプログラムは、ユニットとは別に設定ファイルなどを持っていることがあり、これらを編集する前にプロセスを停止する、あるいは編集後に再起動する必要がある。systemdのユニットとして管理されているプログラムは、原則、systemdのコマンドを使って管理を行なう。

永続的にユニットを実行させないようにするには、ユニットファイルの制御コマンド(表05)を使う。enable、disableコマンドは、ユニットファイルの自動読み込みを許可、禁止するものだ。ただし、このコマンドで読み込みを禁止したとしても、読み込まれる他のユニットが必須としていた場合には、読み込みが行なわれることがある。なお、disableコマンドを実行しても、現在実行中のユニットは動作したままであり、再起動するまでは、disableは有効でない点には注意されたい。ユニットを有効、無効にしたあと、現在のセッションにも反映させたい場合には、“--now”オプションを付ける。これは、stat、stopコマンドを実行したのと同じ効果がある。

  • ■表05

これに対して、maskコマンドは、ユニットファイル自体を無効として、依存関係があったとしても、起動することができなくなる。mask設定したユニットファイルは手動でも起動できない。

ユニットの依存関係には、wantsとrequiresの2つのレベルがあり、wantsの場合、要求したユニットが読み込めなくても自身はエラーにならない。しかし、requiresを指定した場合、指定したユニットが実行できないと、自身の実行がエラーになる。

maskコマンドを使うと、依存関係による起動や手動実行も不可能になる。もし、他のユニットがrequiresとしてmaskコマンドを適用したユニットを指定していると、他のユニットもエラーとなり、連鎖的にsystemdの起動処理がエラーになってしまう可能性がある。このため、ユニットの依存関係をきちんと把握していない場合には、maskコマンドは気軽に使うべきではない。

今回はざっとsystemctlコマンドの使い方を解説した。次回は、systemdの初期化処理全体を調べる方法などを解説する。

> Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/