systemctlとsystemdでLinuxサービス管理を極める方法

📖 この記事は約 14 分で読めます。
概要

Linux systemdは、Linuxの起動からサービスの管理までを担う仕組みで、操作にはsystemctlコマンドを使います。本記事では、systemdとsystemctlの違い、init(SysV init)との違い、サービスの起動・停止・確認・自動起動の設定、unitファイルの書き方までを、公式ドキュメントで確認したコマンドで解説します。

管理人

本記事の読者層は以下の方を想定しています。

本記事の読者層
  • UbuntuなどのLinuxサーバーで、サービスの起動・停止・状態確認のやり方を知りたい方
  • サービスの自動起動やunitファイルの書き方まで、基本を押さえておきたい方
目次

Linux systemdとは?systemctlとの違いと役割

結論から言うと、Linux systemdは、Linuxの起動時に最初に動き、その後のサービスやプロセスを管理する「システム・サービスマネージャ」です。そのsystemdを操作するためのコマンドがsystemctlです。

systemdはLinuxカーネルから直接起動され、PID(プロセスID)1として動作します。ほかのプロセスは、systemd自身かその子プロセスから起動されます。主要なLinuxディストリビューションで標準の初期化システムとして使われています(参考:SUSE Linux Micro 6.2「Introduction to systemd Basics」、systemd公式サイト)。

※本記事のコマンドは、systemdのマニュアル(man systemctl)と、上記SUSEのドキュメント(2026年10月時点)の記載で確認しています。

systemdとsystemctlの違い

systemdは管理を行う「本体」、systemctlはその状態を確認・操作する「窓口のコマンド」です。あわせて、次のコマンドもよく使います。

  • systemd:サービスの起動・停止、依存関係の管理などを行う本体
  • systemctl:systemdの状態を確認し、サービスなどを操作するコマンド
  • journalctl:systemdが集めたログ(ジャーナル)を表示するコマンド
  • systemd-analyze:起動にかかった時間などを分析するコマンド

systemdとinit(SysV init)の違い

SysV initは、systemdより前から使われてきた初期化システムです。systemdはSysV initのスクリプトとの後方互換性を持ちながら、次の点で異なります。

  • 起動処理を、unitファイルという宣言的な設定ファイルで記述する
  • unit同士の依存関係を管理し、起動を並列で進める
  • ログ(ジャーナル)やリソースの管理も、systemdの仕組みにまとめられている

systemdはどこにある?unitファイルの置き場所

systemdはユーザーが直接起動するものではなく、システムの起動の早い段階で、カーネルが/sbin/init経由で起動します。普段意識するのは、systemdの本体よりも、サービスの設定を書いた「unitファイル」の置き場所です。

場所用途
/usr/lib/systemd/system/(環境によっては/lib/systemd/system/)パッケージが配置する標準のunitファイル
/etc/systemd/system/管理者が追加・上書きするunitファイル
/run/systemd/system/再起動すると消える一時的な設定
~/.config/systemd/user/一般ユーザー向けのユーザーサービス(systemctl –user で操作)

あるサービスのunitファイルの場所は、systemctl status サービス名 の「Loaded:」行に表示されます。ファイルの中身は systemctl cat サービス名 で確認できます。

systemctlの基本コマンド:Linux systemdの使い方

システム全体のサービスを操作するときは管理者権限が必要なため、以降のコマンドには sudo を付けて記載します。サービス名の「.service」は省略できます(apache2 は apache2.service と同じ意味です)。

操作コマンド説明
起動sudo systemctl start サービス名サービスを今すぐ起動します
停止sudo systemctl stop サービス名動いているサービスを停止します
再起動sudo systemctl restart サービス名停止してから起動します。動いていなければ起動します
設定の再読み込みsudo systemctl reload サービス名サービス側の設定ファイルを再読み込みします(対応しているサービスのみ)
状態確認sudo systemctl status サービス名状態と直近のログを表示します

例えば、UbuntuでApacheを起動する場合は sudo systemctl start apache2 と入力します。サービス名はディストリビューションやパッケージによって異なることがあるため、名前が分からないときは systemctl list-unit-files | grep apache のように一覧から探します。

なお、reload が読み込むのはサービス側の設定ファイルで、systemdのunitファイルではありません。unitファイルを編集したときは、あとで説明する daemon-reload を実行します。

サービスの状態を確認する方法:Linux systemd 確認

サービスが動いているかどうかは、次のコマンドで確認できます。

  • systemctl status サービス名:サービス1つの状態と、直近のログを表示します
  • systemctl is-active サービス名:動作中かどうかを確認します(動作中なら終了コードが0になります)
  • systemctl list-units --type=service:現在systemdが把握しているサービスの一覧です。標準では、動作中・処理待ち・失敗のものが表示され、--all を付けると停止中のものも表示されます
  • sudo systemctl --state=failed:失敗したunitだけを表示します
  • sudo journalctl -u サービス名:そのサービスのログを表示します

systemctl status の表示では、次の2行に注目します。

  • Loaded::unitファイルが読み込まれているか、ファイルの場所、自動起動が有効(enabled)かどうか
  • Active::現在の状態です。「active (running)」は動作中、「failed」は異常終了などで失敗した状態を表します

「failed」のときは、原因がログに記録されるため、journalctl -u サービス名 で確認します。起動に時間がかかる場合は、systemd-analyze blame でunitごとの起動時間を調べられます。

Linux systemdで自動起動を設定する方法

サーバーの再起動後に、サービスが自動で立ち上がるかどうかは、運用上の重要なポイントです。例えば、データベースのように止まっては困るサービスは自動起動に設定し、使わないサービスは無効にしておく、といった使い分けをします。

  • sudo systemctl enable サービス名:自動起動を有効にします
  • sudo systemctl disable サービス名:自動起動を無効にします
  • sudo systemctl enable --now サービス名:自動起動を有効にして、同時に今すぐ起動します
  • sudo systemctl disable --now サービス名:自動起動を無効にして、同時に今すぐ停止します
  • systemctl is-enabled サービス名:自動起動が有効かどうかを確認します

注意したいのは、enable だけでは、そのサービスを今すぐ起動しない点です。「有効にする」ことと「起動する」ことは別の操作なので、今すぐ動かしたいときは --now を付けるか、start を別に実行します。

自動起動も手動起動もできないようにしたいときは、sudo systemctl mask サービス名 を使います。disable より強い設定なので、元に戻すときは unmask を実行します。

Unitとは?種類と一覧の確認方法

systemdは、管理対象を「Unit(ユニット)」という単位で扱います。Unitは、unitファイルという設定ファイルで定義され、拡張子で種類が分かります。

種類拡張子役割
サービス.serviceサービスやアプリの起動・停止の方法を定義します
ターゲット.target起動時の同期点となり、unitをまとめます
マウント.mountファイルシステムのマウントポイントを定義します
タイマー.timer定期実行や遅延実行を定義します
ソケット.socketソケットへの通信をきっかけにサービスを起動します
パス.pathファイルやディレクトリの変化をきっかけに起動します

Unitの一覧には、目的の違う2つのコマンドがあります。

  • systemctl list-units:現在systemdが把握しているunitを表示します(実行中かどうかを見たいとき)
  • systemctl list-unit-files:インストールされているunitファイルと、有効・無効などの状態を表示します(自動起動の設定を見たいとき)

ターゲットは、システムをどの状態で起動するかを決めます。サーバーでよく使うのは、コンソール中心の複数ユーザー環境である multi-user.target と、グラフィカルな環境の graphical.target です。起動時に使うターゲットは、systemctl get-default で確認でき、systemctl set-default で変更できます。

また、unitファイルには、他のunitとの関係を書けます。Wants や Requires で一緒に起動するunitを、Before や After で起動の順序を指定します。これにより、サーバーの起動順序を制御できます。

systemd timerとは?cronに近い定期実行の仕組み

「.timer」のunitは、cronのように、決めた時刻や間隔で処理を実行するための仕組みです。タイマーに指定した時刻になると、同じ名前の「.service」のunitが起動します。

登録されているタイマーは、systemctl list-timers で確認できます。次回の実行時刻や、前回の実行時刻も一覧で表示されます。

unitファイル(service)の書き方の基本:Linux systemd service

独自のプログラムをサービスとして動かすには、「.service」のunitファイルを作ります。最小限の例は次のとおりです。ここでは、ファイル名とプログラムのパスは仮のものです。

[Unit]
Description=My custom service

[Service]
ExecStart=/usr/local/bin/my-app
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
  • [Unit]:サービスの説明など、unitの基本情報を書きます
  • [Service]:ExecStart に起動するプログラムを書きます。Restart=on-failure は失敗したときの再起動、RestartSec は再起動までの待ち時間(秒)です
  • [Install]:enable したときの動作を書きます。WantedBy=multi-user.target は、複数ユーザー環境の起動時に使う指定です

作成から起動までの流れは、次のとおりです。

  1. /etc/systemd/system/my-custom-service.service として保存します
  2. sudo systemd-analyze verify /etc/systemd/system/my-custom-service.service で、構文のエラーがないか確認します
  3. sudo systemctl daemon-reload で、systemdにunitファイルの変更を読み込ませます
  4. sudo systemctl enable --now my-custom-service で、自動起動の有効化と起動を行います
  5. sudo journalctl -u my-custom-service で、ログを確認します

unitファイルの ExecStart には、プログラムの絶対パスを書きます。systemdは、ユーザーの環境変数 $PATH を使って実行ファイルを探さないためです。

systemdの問題点は?よくある批判と採用状況

systemdには、批判もあります。Wikipediaでは、機能が増え続けている(機能の肥大化)、Linux以外のUnix系OSでは動かず互換性に影響する、機能が多い分だけ攻撃対象が広いといった指摘が整理されています。こうした理由から、systemdを使わないディストリビューションも一部にあります。

一方で、主要なLinuxディストリビューションでは標準の初期化システムとして採用されています。UbuntuなどでサーバーやWebサービスを運用するなら、systemdとsystemctlの基本を押さえておくと役立ちます。

まとめ

本記事のまとめ

Linux systemdは、起動からサービス管理までを担う仕組みで、systemctlはそれを操作するコマンドです。基本コマンドとunitの考え方を押さえれば、サービスの起動・停止・確認・自動起動を見通しよく管理できます。

  • systemdは管理の本体、systemctlは操作用のコマンド。状態確認はstatusとjournalctlが基本
  • 自動起動はenable、今すぐ起動も同時に行うなら–now。unitの一覧は、現在の状態を見るlist-unitsと、インストール済みのファイルを見るlist-unit-filesで使い分ける
  • 定期実行は.timer、独自のサービスは/etc/systemd/system/にunitファイルを置いてdaemon-reloadで読み込ませる

次回の記事をご期待ください。どうぞよろしくお願いいたします。

関連リンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次