はじめに:systemdとは何か?

現代の多くのLinuxディストリビューションでは、「systemd」が標準のinitシステムおよびサービスマネージャーとして採用されています。サーバーを運用する上で、Webサーバーやデータベースなどのサービスを管理する作業は欠かせません。systemdを理解することは、これらのサービスを確実かつ効率的に管理するための第一歩です。

systemdは、従来のSysVinitやUpstartといったinitシステムの後継として開発されました。サービスの並列起動による高速なブート、依存関係の管理、cgroupsを利用したリソース制御など、多くの先進的な機能を備えています。この記事では、Linux初中級者の方を対象に、systemdの中核をなすsystemctlコマンドを使った基本的なサービス管理方法に焦点を当てて解説します。

`systemctl`コマンドの基本:サービスの起動・停止・状態確認

systemdでサービスを管理する上で最も頻繁に利用するのがsystemctlコマンドです。ここでは、サービスの基本的な操作である起動、停止、再起動、そして状態確認の方法を見ていきましょう。ここでは例としてNginxウェブサーバー(サービス名: nginx)を扱います。

サービスの起動にはstart、停止にはstopを使用します。設定ファイルを変更した際などにはrestartで再起動できます。

# サービスを起動する
sudo systemctl start nginx

# サービスを停止する
sudo systemctl stop nginx

# サービスを再起動する
sudo systemctl restart nginx

そして、サービスが正常に動作しているか確認するためにstatusコマンドが非常に重要です。このコマンドを実行すると、サービスがアクティブ(active (running))か、停止している(inactive (dead))か、あるいはエラーで失敗した(failed)かといった状態や、最近のログを確認できます。

$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-10-26 10:00:00 JST; 1h ago
   Main PID: 1234 (nginx)
      Tasks: 2 (limit: 4615)
     Memory: 4.5M
     CGroup: /system.slice/nginx.service
             ├─1234 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             └─1235 nginx: worker process

サービスの自動起動を管理する (enable/disable)

サーバーを再起動した際に、特定のサービスが自動的に起動するように設定しておくことは非常に重要です。systemdでは、この自動起動設定をenableコマンドとdisableコマンドで簡単に管理できます。

サービスをシステムの起動時に自動で開始させたい場合はenableを使います。逆に、自動起動を止めたい場合はdisableを使用します。

# Nginxサービスの自動起動を有効にする
sudo systemctl enable nginx

# Nginxサービスの自動起動を無効にする
sudo systemctl disable nginx

ここで注意すべき点は、enableコマンドはあくまで「次回の起動時から自動で起動する」という設定を行うだけで、今すぐサービスを起動するわけではないということです。設定を有効にした後、すぐにサービスを起動したい場合は、別途systemctl startコマンドを実行する必要があります。この2つの操作を一度に行う便利なコマンドとして--nowオプションがあります。

# 自動起動を有効化し、同時にサービスを起動する
sudo systemctl enable --now nginx

現在の自動起動設定はis-enabledコマンドで確認できます。

$ systemctl is-enabled nginx
enabled

systemdの心臓部:ユニットファイルとは?

systemdは「ユニット」という単位で管理対象を定義します。サービス(.service)、マウントポイント(.mount)、タイマー(.timer)など、様々な種類のユニットが存在します。サービスの定義は「サービスユニットファイル」と呼ばれるテキストファイルに記述されています。

ユニットファイルは主に/usr/lib/systemd/system/(パッケージによって提供)や/etc/systemd/system/(システム管理者が作成・変更)に配置されます。簡単なサービスユニットファイルは、以下のようなセクションで構成されています。

# /etc/systemd/system/myservice.service の例

[Unit]
Description=My Custom Service
After=network.target

[Service]
ExecStart=/usr/local/bin/my-app
Restart=always
User=myappuser

[Install]
WantedBy=multi-user.target

各セクションの主な役割は以下の通りです。

  • [Unit]: サービスの説明や起動順序の依存関係(例: network.targetが起動した後に開始する)を定義します。
  • [Service]: サービスの起動コマンド(ExecStart)、実行ユーザー(User)、再起動ポリシー(Restart)などを定義します。
  • [Install]: systemctl enableが実行された際に、どのターゲット(ランレベルのようなもの)で有効になるかを定義します。multi-user.targetは一般的なCUI環境のターゲットです。

自分でユニットファイルを作成したり、既存のファイルを変更した後は、必ず以下のコマンドを実行してsystemdに設定を再読み込みさせる必要があります。

sudo systemctl daemon-reload

まとめ:systemdで効率的なサービス管理を

この記事では、systemdを使った基本的なサービス管理方法について解説しました。systemctlコマンドを使えば、サービスの起動・停止から自動起動設定まで、一貫した操作で簡単に行うことができます。

今回学んだ主要なポイントを振り返ってみましょう。

  • サービスの操作: systemctl start, stop, restart, status
  • 自動起動の設定: systemctl enable, disable
  • 設定の反映: ユニットファイルを変更したらsystemctl daemon-reloadを実行

systemdはサービス管理以外にも、journalctlコマンドによる詳細なログの閲覧、タイマーユニットによるcronのような定期実行など、非常に多機能です。まずは今回紹介した基本的なサービス管理をマスターし、そこからさらに応用的な機能へと学習を進めていくことで、Linuxサーバーの管理スキルを大きく向上させることができるでしょう。