【Linux】systemdとsystemctlコマンド:サービスの自動起動、停止、再起動

時計 2021.11.11 / 時計

【Linux】systemdとsystemctlコマンド:サービスの自動起動、停止、再起動

記事ではLinuxディストリビューションにおける、systemdsystemctlコマンドについて詳しく解説していきます。

UbuntuやCentOSなど多くのLinuxディストリビューションでは、systemdでサービスやデーモンを管理し、systemctlコマンドでsystemdをコントロールします。これらはシステムおよびサービスマネージャーとして動作するために密接に関連しています。

systemdとsystemctlコマンドは現代のLinuxシステムにおいて重要なツールです。サービスの自動起動の設定やサービスの再起動など、Linux系のWebサーバーでは必須の知識となります。

システム管理者やエンジニアはsystemdとsystemctlコマンドを理解することで、日常業務やトラブル時の対応を効率的に行えるようになります。

ぜひ本記事を通して、Linuxのsystemdとsystemctlコマンドについて理解を深めてください。

2024.06.02 記事を追記および修正いたしました

systemd

systemdとは

systemdとはLinuxシステムの起動やサービス管理を効率化するために設計されたプログラム(システム)です。systemdはカーネルによって最初に起動されるプログラムであり、一番最初に起動するのでプロセスIDは1です。

Linux用語の確認

Linuxのsystemdにおけるサービスとはバックグランドで動作するプログラムやデーモンを意味します

またsystemdはサービスやデーモンの起動などを管理するプログラムであり、すべてのデーモンを管理するデーモンとも言えます。いわばデーモンの親であり、その他のデーモンは子です。

デーモンとは

デーモン(daemon)とはメモリ上に常駐し、処理要求を待ち続けるバックグラウンドで動作し続けるプログラムです。

デーモンはシステムの重要な機能を提供し、ユーザーが直接操作することはなく、システムが自動的に起動して特定のタスクを継続的に実行します。

デーモンの特徴としては以下の通りです。

  1. バックグラウンドで動作し続け、ユーザーが直接操作することはない
  2. システムの起動時に自動的に起動して、常に動作し続ける
  3. スケジュールされたタスクの実行、ログの記録など特定の役割を担当する

デーモンファイルには末尾に「d」を付けることが多いです。主にWebサーバーや、FTP、SSHなどはデーモンで動作しています。

systemdのような親プログラムはinitプロセスと呼ばれます。

systemdを操作するためのコマンドラインツールがsystemctlです。systemctlについて詳しくは後述しています。

systemdが登場するまではSystemVやinitが利用されていました。systemdは並列でサービスを起動できるため、それらより高速であるという特徴を持ちます。

処理の単位:unit(ユニット)

systemdはunit(ユニット)という単位でサービス(処理)やシステムリソースを管理しています。ユニットには次のような種類があります。

unitの種類
  • デーモンやサービスを管理するサービスユニット
  • ソケットファイルを管理するソケットユニット
  • 特定の状態を管理して依存関係を管理するターゲットユニット
  • 特定の時間にサービスを実行するタイマーユニット
  • ファイルシステムのマウントを管理するマウントユニット

unitは設定ファイルと呼ばれるファイルで定義されており、サービスの設定や動作を記述しています。設定ファイルは接尾辞が「service(サービスユニット)」や「target(ターゲットユニット)」のファイルです。

unit設定ファイルの保存先は以下2か所があります。

  1. /usr/lib/systemd/system/
  2. /etc/systemd/system/

1番は初期の保存先であり、ここのファイルを編集することはありません。
2番には初期設定を上書きする場合や自作の設定ファイルを作成したい場合に、それらファイルを置きます。

1番と2番のディレクトリに同じ名前のUnit設定ファイルがあった場合は2番のファイルが優先されます。そのため初期設定を上書きしたい場合は、2番のディレクトリにファイルを置きます。

基本的には1番にある設定ファイルを2番のディレクトリにコピーして、コピーしたファイルを修正して利用します。

Unit設定ファイルの自作については以下記事をご参照ください。

systemdのログ

systemdによって起動したサービスやデーモンのログは以下ディレクトリにバイナリ形式で保存されます。

/var/log/journal

各サービスのログを確認するにはjournalctlコマンドを使用します。

$ sudo journalctl -f -u サービス名

サービスの起動などで不具合があれば、上記コマンドでエラー内容が表示されます。

systemdの特徴

systemdの特徴を以下にまとめます。

systemdの特徴
  • システム起動時にサービスを並列で起動する
  • システムリソースやサービスをユニットとして管理する
  • コマンドラインツールのsystemctlで操作する
  • ユニット間の依存関係を自動で管理する
  • システムログの一元管理をする
  • プロセスやサービスのリソース使用量を管理する

systemctlコマンド

systemctlコマンドとは

systemctlコマンドはCentOSやRedhat7系から利用できる、「systemd」をコントロールするコマンドです。以前まで使用されていたserviceコマンドとは異なります。

POINT

systemdはシステム全体の管理を行い、systemctlはその管理操作をコマンドラインから実行するためのツールと考えてください

systemctlを利用することでサービスの起動・停止・再起動や自動起動の設定、サービス状態の確認、サービスの有効化・無効化などの操作が簡単にできます。

serviceコマンドはinitを呼び出しますが、systemctlコマンドはバイナリコマンドです。
initの代替機能であり、高度なシステム管理機能を提供します。

Linuxでのサービスとはアプリケーションを指します。Webサーバーやファイアウォールといった各アプリケーションもすべてサービスです。

つまりアプリケーションの動作をコントロールするコマンドがsystemctlです。

基本的には以下の構文にそってsystemctlコマンドは使います。

構文

systemctl [オプション] 命令 [サービス名]

命令には次のような種類があります。

命令 説明
start サービスの開始
stop サービスの停止
restart サービスの再起動
reload サービスの再読み込み
status サービスの状態表示
enable サービスの自動起動オン
is-enable サービスの自動起動確認
disable サービスの自動起動オフ
daemon-reload 設定ファイルの再読み込み
# 使用例
$ systemctl start nginx
$ systemctl stop nginx
$ systemctl restart nginx

systemctlコマンドでは次のオプションが利用できます。

オプション 説明
-a または –-all 全サービス/プロパティを表示
-t または –-type= 特定サービスを指定
-l または full ユニット名・プロセスツリーエントリー・ジャーナル出力を省略しない
--show-types ソケット表示でタイプを表示
--no-block 要求された操作が終了するまで同期的に待たない

サービスの開始と停止

systemctlを使ってサービスを開始する場合は以下構文に沿ってコマンドを実行します。

構文

systemctl start サービス名

例えばNginxというWebサーバーのサービスを開始する場合は以下コマンドを実行します。

systemctl start nginx

関連記事:Nginxとは

上記コマンドによりNginxのサービスは起動します。

次にサービスを起動しているサービスを停止する場合は以下構文に沿ってコマンドを実行します。

構文

systemctl stop サービス名

例えばNginxというWebサーバーのサービスを停止する場合は以下コマンドを実行します。

systemctl stop nginx

現在のサービスの起動状態を確認:list-units

サーバーで現在起動しているサービスの状態を確認する場合は、以下コマンドを実行します。

$ systemctl list-units -t service

表示された一覧から「ACTIVE」欄を確認し、activeであれば起動中、inactiveであれば停止中、failedならば起動失敗していることがわかります。

「SUB」欄にはrunningまたはexitedが表示されます。

サービスにはデーモンとして起動中のものと必要な処理を実行したら終了するものがあります。

runningはクライアントからのアクセスを待ち続けている状態、つまりデーモンを表し、exitedは次に呼び出されるまで待機している状態を表します。

サーバー起動時のサービス自動起動:list-unit-files

サーバー起動時にサービスが自動的に起動するようにしたい場合は、systemctlに命令enableを使用します。

$ systemctl enable サービス名

サービスの自動起動を停止したい場合は、systemctlに命令disableを使います。

$ systemctl disable サービス名

すべてのサービスの自動起動可否を確認するには以下コマンドを実行します。

$ systemctl list-unit-files -t service

上記コマンドを実行すると、左から「UNIT FILE」「STATE」「VENDOR PRESET」の一覧が表示されます。

「STATE」が現在の状態であり、enableが自動起動ON、disableが自動起動OFFです。staticとindirectは他サービスに依存して起動するサービスです。

特定のサービスのみで自動起動かどうか確認したい場合は、以下のコマンドを実行します。

$ systemctl is-enabled サービス名

上記コマンドでenableまたはdisbledが返ってきます。

サービスの状態確認:status

個々のサービスの状態を詳しく確認したい場合は、次のコマンドを実行します。

$ systemctl status サービス名

上記コマンドを実行すると現在のサービスの状態(起動しているか(active)、停止中か(inactive)、起動失敗か(failed))やログメッセージ、アクティビティなどを確認できます。

例えばNginxサービスの状態を確認する場合は以下コマンドを実行します。

$ systemctl status nginx

まとめ

本記事「【Linux】systemdとsystemctlコマンド:サービスの自動起動、停止、再起動」はいかがでしたか。

systemdはカーネルによって最初に起動されるプログラムで、サービスやデーモンの起動などを管理するプログラムです。
systemctlコマンドは「systemd」をコントロールするコマンドで、サービスの起動・停止や自動起動の設定、サービス状態の確認などができます。

本記事でsystemdとsystemctlコマンドの関係が理解できたと思います。

UbuntuやCentOSといったLinuxディストリビューションを利用しているなら、systemdやsystemctlコマンドを理解することでサーバー管理がより楽になると思います。