systemd は、Ubuntu を含む主要な Linux OS で採用されているシステム管理およびサービス管理の仕組みです。

OS 起動時に最初に実行されるプロセス(PID 1)として、サービスの並列起動、依存関係の解決、ログ管理を一括で行います。「ユニットファイル」という設定ファイルで、バックグラウンドで動くプログラムの自動起動や再起動を制御します。

ユーザーサービスとシステムサービス

架空のアプリケーション foo と、Web サーバー Apache を例に、それぞれの構築手順と違いを説明します。

[!NOTE] アプリケーションのバイナリは、ユーザーサービス・システムサービスによらず、通常 /usr/bin または /usr/local/bin に配置されます。
apt でインストールした場合は /usr/bin に入り、apt upgrade などによる更新の対象になります。
make install や GitHub 配布のバイナリなど apt を使わないものは、慣習的に /usr/local/bin に置きます(自動で置かれるとは限らず、その場合はユーザーが手動で配置します)。
詳しくは /usr/bin, /usr/local/bin を参照してください。

ユーザーサービス:特定のユーザー権限で動かす

自分専用のツールや、管理者権限(root)を必要としないアプリを動かす場合に適しています。

設定手順

架空のサービス foo をユーザーサービスとして稼働させる手順です。ユーザーサービスでは、「設定ファイルの場所」と「ユニットファイルの自作」がポイントです。

  1. プログラムのインストール
    • sudo apt install foo:バイナリ(実行ファイル)はシステムに入れますが、実行はユーザー権限で行います
  2. アプリケーション設定ファイルの作成
    • 設定ファイルは ~/.config(ドットが必要)配下に置くのが一般的です
    • パス: ~/.config/foo/config.yaml
  3. サービス定義(ユニットファイル)の作成
    • 「ユーザーサービス」であることをシステムに教えるファイルを、自分で作成します
    • パス: ~/.config/systemd/user/foo.service
  4. サービスの起動と自動起動の設定

[!WARNING] apt install で入るデーモンは、パッケージがシステムサービスとして自動的に有効化・起動する場合があります。ユーザーサービスとして動かすときは、sudo systemctl disable --now foo.service でシステム側を無効化する必要があるかもしれません。

サービス定義の例

[Unit]
Description=My Foo Service

[Service]
ExecStart=/usr/bin/foo --config %h/.config/foo/config.yaml
Restart=on-failure

[Install]
WantedBy=default.target

%h は、ユーザーのホームディレクトリを表す指定子です。

サービスの起動

操作時は必ず --user フラグを付けます。

systemctl --user daemon-reload
systemctl --user enable --now foo.service   # 自動起動を有効化して、すぐに起動
systemctl --user status foo.service
journalctl --user -u foo.service            # ログの確認

[!NOTE]

  • ユニットファイルを変更した場合は、systemctl --user daemon-reload で反映します。
  • アプリケーションの設定ファイルを変更した場合は、systemctl --user restart foo.service で反映します。
  • systemctl --user は、ユーザーのセッションが必要です。sudosu 経由で実行すると Failed to connect to bus になる場合があります。

システムサービス:OS 全体で動かす

Web サーバーやデータベースなど、サーバーの起動と同時に動き出し、全ユーザーや外部ネットワークから利用されるミドルウェアに適しています。

例:Web サーバー Apache の設定手順

パッケージとして提供されるシステムサービスは、apt でインストールした時点で、サービスの定義がほぼ完了しています

  1. インストール
    • sudo apt install apache2
    • サービス定義ファイル(/usr/lib/systemd/system/apache2.service/lib/systemd/system/ も同じ場所)が自動で作成され、OS に登録されます。自分でユニットファイルを書く必要はありません
    • インストール後は自動的に有効化され、起動します
  2. アプリケーション設定の編集
    • 設定ファイルは管理者の領域にあり、編集には sudo が必要です
    • パス: /etc/apache2/apache2.conf、サイト単位の設定は /etc/apache2/sites-available/
  3. サービスの操作
    • システム全体に影響するため、コマンドの先頭に sudo を付けます。サービス名の末尾の .service は省略できます
# 起動
sudo systemctl start apache2
# 設定変更後の反映(サービスを止めずに再読み込み)
sudo systemctl reload apache2
# 状態
systemctl status apache2

パッケージ提供のユニットを変更する

パッケージが提供するユニットファイル(/usr/lib/systemd/system/)は直接編集せず、drop-in(上書き)を使います。

sudo systemctl edit apache2
# → /etc/systemd/system/apache2.service.d/override.conf が作成される

自作のシステムサービス

パッケージにならないアプリケーションをシステムサービスにする場合は、ユニットファイルを /etc/systemd/system/ に置きます。

# /etc/systemd/system/foo.service
[Unit]
Description=My Foo Service
After=network.target

[Service]
User=foo
ExecStart=/usr/local/bin/foo --config /etc/foo/config.yaml
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now foo.service

どちらを使うべきか:比較まとめ

項目 ユーザーサービス (foo) システムサービス (apache2)
主な用途 個人用ツール、開発環境 Web サーバー、DB、公開サービス
管理者権限(sudo) 実行・操作には不要 常に必要
定義ファイルの場所 ~/.config/systemd/user/ パッケージ提供: /usr/lib/systemd/system/
自作: /etc/systemd/system/
ポート番号の制限 既定では 1024 番以降のみ使用可能(※) 80 番や 443 番を使用可能
自動起動のタイミング ユーザーがログインしたとき(enable が必要。Linger を設定すれば OS の起動時) OS が起動したとき(enable が必要。パッケージは通常自動で有効化)

※ 既定では net.ipv4.ip_unprivileged_port_start が 1024 です。この値を変更すれば、一般ユーザーも 1024 未満のポートを使えます。

「Linger」設定について
ユーザーサービスは、そのユーザーの最後のセッションが終了すると停止します。sudo loginctl enable-linger $USER を実行しておけば、ログインしていなくても OS の起動時から動かし続けられます。

まとめ

  • ユーザーサービスは、自分のホームディレクトリにユニットファイルを書き、--user を付けて操作する。
  • システムサービスは、パッケージなら apt が登録してくれる。自作する場合は /etc/systemd/system/ に置き、sudo で管理する。

用途に合わせて使い分けることで、Ubuntu 環境をより安全に運用できます。