概要
サービスとは、PCの起動時に自動的に実行され、バックグラウンドで仕事をするために待機するソフトウェアのことである。
一般的に、サービスはグラフィカルユーザインターフェースを持たず、ユーザの操作無しに動作する。
最もよく知られているサービスは、Web、メール、データベース等のサーバで、Apache、MySQL等がある。
また、ハードウェアの検出やUSBメモリの自動統合(マウント)等もサービスによって行われる。
サービスには、システム起動時に関連するタスクやハードウェアに関連するタスクを行う"内部サービス"と、
その後にユーザがインストールするサービス(通常は全てのサーバサービスを含む)の2種類がある。
技術用語やコンピュータ用語では、サービスは伝統的にデーモンと呼ばれている。
そのため、サーバコンポーネントであるsshdやmysqldのように、サービスを表すプログラムの最後の文字として"d"が用いられることが多い。
一方、Systemdは、システムおよびセッションマネージャ(initシステム)であり、
コンピュータの起動プロセスからシャットダウンまでの全動作時間にわたって、システム上で動作するすべてのサービスを管理する役割を担っている。
プロセスは常に(可能な限り)並行して起動され、起動プロセスを可能な限り短くする。
ここで、.serviceで終わる設定ファイルを作成して、Systemdが制御・監視するプロセスに関するコードを保持する場合をSystemd Service Unitファイルと呼ぶ。
Systemdには、サービス、タイマ、マウントポイント、ソケット、スワップスペース、デバイス等のユニットが存在する。
そのため、Systemdは管理用の設定の全てをファイルから取得する。
Systemdの用語では、これらを"ユニット"と呼び、システム全体に適用されるユニットと各ユーザ領域にのみ適用されるユニットがある。
ユニットには、サービスを開始するためのサービスユニットや、ある時点でのアクションを(繰り返し)実行するためのタイマユニット等、様々な種類がある。
各タイプのユニットファイルに共通しているのは、iniファイルに似た構造をしていることである。
ユニットファイルは、いくつかのセクション(多くの場合、3セクション)で構成されている。
Systemdではセクションと呼ばれ、その中に一連のキーと値のペア(Systemdではディレクティブと呼ばれる)が格納されている。
コマンドライン
コマンドラインやターミナルでSystemdを管理するツールはsystemctlと呼ばれる。
多くのコマンドはシステムに深く介入するため、root権限が必要である。
そのため、必要な操作を行うには、このコマンドをスーパユーザ権限で実行する必要がある。
ログ
Systemdは、ログ情報を中央のジャーナルに書き込む。
これは、journalctl
コマンドにより読み出すことができ、検索やフィルタのオプションも含まれている。
システム全体の単位
usr/lib/systemd/systemディレクトリには、サービスによってシステム全体にプレインストールされているユニットの全てのファイルがある。
/etc/systemd/systemディレクトリには、ユーザが作成または編集したシステム全体のユニットの全てのファイルがある。
/etc/systemd/systemディレクトリと/usr/lib/systemd/systemdディレクトリで同名のユニットファイルがある場合は、
/etc/systemd/systemディレクトリのファイルが優先される。
ユニットの種類
ユニットには様々な種類があり、ファイルの拡張子に応じてsystemdの扱いが異なる。
種類(拡張子) | 説明 |
---|---|
.device | デバイスファイルを作成する。 |
.mount | ファイルシステムのマウントとアンマウントをする。 |
.path | ファイルやディレクトリの変更に応じたサービスユニットを実行する。 |
.network | ネットワークの設定を行う。 |
.service | サービスを設定する。 |
.socket | プロセス間の接続を確立する。 |
.target | ユニットのグループを定義する。 |
.timer | Cronジョブのような定期的なタスクを実行する。 |
ここでは、.service拡張子のユニットについて記載する。
独自のユニットやSystemdサービスファイルの作成
例えば、PC起動時に何らかのスクリプトやソフトウェアをバックグラウンドで実行したいとする。
そのためには、サービスユニットを作成する必要がある。
サービスユニットを作成するための構文を、以下に示す。
まず、/usr/lib/systemd/systemディレクトリに、ユニットファイルを作成する。
sudo vi /usr/lib/systemd/system/<ユニットファイル名>.service または sudo vi /etc/systemd/system/<ユニットファイル名>.service
[Unit] Description = # <- サービスの説明を記述する After = network.target [Service] ExecStart = # <- 実行するファイルまたはスクリプトへのフルパス [Install] WantedBy = # <- multi-user.target または graphical.target等
以下の例では、Glancesという名前のサービスファイルを作成して、Linux向けの監視ツールであるglancesをバックグラウンドで動作させている。
sudo vi /usr/lib/systemd/system/glances.service
[Unit] Description = Glances in Web Server Mode After = network.target [Service] ExecStart = /usr/bin/glances -w -t 5 [Install] WantedBy = multi-user.target
[Install]
セクションでは、[WantedBy]
キーにより、ユニットがいつ起動するかを指定する。
下表に、指定することができるキーの値を示す。
ターゲット | 説明 |
---|---|
multi-user.target | グラフィカルログインの有無にかかわらず、マルチユーザシステム用(ランレベル3に対応) |
graphical.target | グラフィカルログインが必要なマルチユーザシステム用(ランレベル3 + グラフィカルログインに対応) |
rescue.target | 一般的に、シングルユーザモードはシステムのレスキュー時にのみ必要(ランレベル1に対応) |
reboot.target | システムの再起動時にのみユニットが実行する。 |
poweroff.target | システムのシャットダウン開始時にのみ実行するユニットである。 |
default.target | 別の既存ターゲットへのシンボリックリンクである。 例えば、Ubuntuデスクトップの初期設定では、default.targetはgraphical.targetである。 |
手動で作成したシステムのサービスユニットを有効にする
サービスユニットの作成後は、サービスを有効にして起動する必要がある。
<サービスユニットのファイル名>において、
例えば、上記で作成したglancesサービスを有効にするには、sudo systemctl enable glances.service
となる。
以下のコマンドを実行して、新しいサービスユニットを読み込み・追加する。
sudo systemctl daemon-reload
サービスユニットを自動起動に設定する。
sudo systemctl enable <サービスユニットのファイル名>
サービスユニットを起動する。
sudo systemctl start <サービスユニットのファイル名>
サービスユニットの状態を確認する。
sudo systemctl status <サービスユニットのファイル名>