【Linux】systemdとsystemctlコマンド:サービスの自動起動、停止、再起動
2021.11.11 /
本記事ではLinuxディストリビューションにおける、systemdとsystemctlコマンドについて詳しく解説していきます。
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のsystemdにおけるサービスとはバックグランドで動作するプログラムやデーモンを意味します
またsystemdはサービスやデーモンの起動などを管理するプログラムであり、すべてのデーモンを管理するデーモンとも言えます。いわばデーモンの親であり、その他のデーモンは子です。
デーモンとは
デーモン(daemon)とはメモリ上に常駐し、処理要求を待ち続けるバックグラウンドで動作し続けるプログラムです。
デーモンはシステムの重要な機能を提供し、ユーザーが直接操作することはなく、システムが自動的に起動して特定のタスクを継続的に実行します。
デーモンの特徴としては以下の通りです。
- バックグラウンドで動作し続け、ユーザーが直接操作することはない
- システムの起動時に自動的に起動して、常に動作し続ける
- スケジュールされたタスクの実行、ログの記録など特定の役割を担当する
デーモンファイルには末尾に「d」を付けることが多いです。主にWebサーバーや、FTP、SSHなどはデーモンで動作しています。
systemdのような親プログラムはinitプロセスと呼ばれます。
systemdを操作するためのコマンドラインツールがsystemctlです。systemctlについて詳しくは後述しています。
systemdが登場するまではSystemVやinitが利用されていました。systemdは並列でサービスを起動できるため、それらより高速であるという特徴を持ちます。
処理の単位:unit(ユニット)
systemdはunit(ユニット)という単位でサービス(処理)やシステムリソースを管理しています。ユニットには次のような種類があります。
- デーモンやサービスを管理するサービスユニット
- ソケットファイルを管理するソケットユニット
- 特定の状態を管理して依存関係を管理するターゲットユニット
- 特定の時間にサービスを実行するタイマーユニット
- ファイルシステムのマウントを管理するマウントユニット
unitは設定ファイルと呼ばれるファイルで定義されており、サービスの設定や動作を記述しています。設定ファイルは接尾辞が「service(サービスユニット)」や「target(ターゲットユニット)」のファイルです。
unit設定ファイルの保存先は以下2か所があります。
- /usr/lib/systemd/system/
- /etc/systemd/system/
1番は初期の保存先であり、ここのファイルを編集することはありません。
2番には初期設定を上書きする場合や自作の設定ファイルを作成したい場合に、それらファイルを置きます。
1番と2番のディレクトリに同じ名前のUnit設定ファイルがあった場合は2番のファイルが優先されます。そのため初期設定を上書きしたい場合は、2番のディレクトリにファイルを置きます。
基本的には1番にある設定ファイルを2番のディレクトリにコピーして、コピーしたファイルを修正して利用します。
Unit設定ファイルの自作については以下記事をご参照ください。
【Linux】systemd:Unit定義ファイル(サービス)の自作とsystemctlによる登録
systemdのログ
systemdによって起動したサービスやデーモンのログは以下ディレクトリにバイナリ形式で保存されます。
/var/log/journal
各サービスのログを確認するにはjournalctlコマンドを使用します。
$ sudo journalctl -f -u サービス名
サービスの起動などで不具合があれば、上記コマンドでエラー内容が表示されます。
systemdの特徴
systemdの特徴を以下にまとめます。
- システム起動時にサービスを並列で起動する
- システムリソースやサービスをユニットとして管理する
- コマンドラインツールのsystemctlで操作する
- ユニット間の依存関係を自動で管理する
- システムログの一元管理をする
- プロセスやサービスのリソース使用量を管理する
systemctlコマンド
systemctlコマンドとは
systemctlコマンドはCentOSやRedhat7系から利用できる、「systemd」をコントロールするコマンドです。以前まで使用されていたserviceコマンドとは異なります。
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のサービスは起動します。
次にサービスを起動しているサービスを停止する場合は以下構文に沿ってコマンドを実行します。
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コマンドを理解することでサーバー管理がより楽になると思います。