systemdサービス自動起動の設定方法|Linux管理者向けハウツーガイド

※本記事はプロモーションを含みます。

systemdサービスの自動起動設定は、LinuxシステムにおけるOS管理の基本スキルです。本記事では、サーバー管理・デバイス運用に携わるシステム管理者向けに、実践的な設定方法からトラブルシューティングまでを解説します。読了時間:約8~10分。

目次

  1. systemdとは何か
  2. 基本的な自動起動設定の流れ
  3. よくあるトラブルと対処法
  4. 実践例:複数サービスの設定
  5. セキュリティ上の注意点

systemdとは何か

systemdは、Red Hat系(CentOS 7以降)・Debian系(Ubuntu 15.04以降)などの多くのLinuxディストリビューションで採用されているシステム初期化フレームワークです。従来のSysVinitに代わり、現在のLinux環境ではデファクトスタンダードとなっとされています。

systemdの最大の特徴は、サービス(デーモンプロセス)の起動・停止・再起動を統一的に管理できる点です。Webサーバー(nginx・Apache)、データベース(MySQL・PostgreSQL)、カスタムアプリケーション、バックアップスクリプトなど、あらゆるバックグラウンドプロセスを「ユニット(unit)」として管理します。

systemdが管理する主なユニットタイプは以下の通りです:

ユニットタイプ説明
.serviceデーモンプロセスやアプリケーション
.socketソケット通信の管理
.target起動レベル(runlevel)の定義
.timerスケジュール実行(cronの代替)

本記事では、最もよく使われる.serviceユニットの自動起動設定に焦点を当てます。

基本的な自動起動設定の流れ

1. サービスファイルの確認

既存のサービスが自動起動可能な状態にあるか確認するには、以下のコマンドを実行します:

systemctl list-unit-files –type=service

このコマンドで、すべてのサービスファイルと現在の状態(enabled/disabled/static)が一覧表示されます。

2. サービスファイルの確…

サービスファイルは通常、以下のディレクトリに格納されています:

  • /etc/systemd/system/(システム管理者が作成・編集するファイル)
  • /usr/lib/systemd/system/(パッケージが配置するファイル)
  • ~/.config/systemd/user/(ユーザースコープのサービス)

既存のサービスファイルの内容を確認する場合:

systemctl cat nginx

このコマンドで、nginxサービスファイルの内容が表示されます。

3. カスタムサービスの作成

独自アプリケーションやスクリプトを自動起動したい場合、サービスファイルを作成する必要があります。テンプレートは以下の通りです:

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

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/run.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

各セクションの意味は以下の通りです:

  • [Unit]:サービスの説明や依存関係を定義
  • [Service]:実際の起動処理・ユーザー・リスタート動作を指定
  • [Install]:自動起動の対象となるターゲット(起動レベル)を指定

4. 自動起動の有効化

サービスファイルを作成・編集した後、以下のコマンドで自動起動を有効にします:

sudo systemctl enable myapp.service

設定ファイルの変更を反映させるには、デーモンをリロードします:

sudo systemctl daemon-reload

5. 動作確認とテスト

設定が正しく反映されたか確認するには:

systemctl is-enabled myapp.service

サービスを手動で起動してログを確認します:

sudo systemctl start myapp.service
sudo systemctl status myapp.service
sudo journalctl -u myapp.service -n 50

最後にシステムを再起動し、自動起動が機能していることを確認します:

sudo reboot
systemctl status myapp.service

よくあるトラブルと対処法

自動起動が有効になっていな…

サービスファイルは存在するが、自動起動が機能しない場合があります。原因として考えられるのは:

  • [Install]セクションが記載されていない
  • WantedBy=の値が正しくない(通常はmulti-user.target
  • daemon-reloadコマンドが実行されていない

確認コマンド:

systemctl is-enabled myapp.service

無効の場合は、サービスファイルの[Install]セクションを確認し、改めてenableコマンドを実行してください。

サービスが起動に失敗する場合

自動起動は有効だが、実際には起動していないケースがあります。ログを確認することが重要です:

sudo journalctl -u myapp.service -p err

よくある失敗原因として:

  • 実行ファイルのパスが間違っている
  • スクリプトに実行権限がない(chmod +xが必要)
  • 指定ユーザーが存在しない
  • 依存するディレクトリやファイルが見つからない
  • ポート競合(複数のサービスが同じポートを使用)

サービスが繰り返し再起動さ…

サービスファイルでRestart=alwaysを指定していると、サービスが停止するたびに自動的に再起動されます。この動作が望ましくない場合は:

Restart=no

または特定の終了コードでのみ再起動させたい場合は:

Restart=on-failure
RestartForceExitStatus=1 3

実践例:複数サービスの設定

Node.jsアプリケーション

JavaScriptベースのWebアプリケーションを自動起動する場合のサービスファイル例:

[Unit]
Description=Node.js Web Application
After=network.target

[Service]
Type=simple
User=nodejs
WorkingDirectory=/opt/nodejs-app
ExecStart=/usr/bin/node /opt/nodejs-app/app.js
Environment=”NODE_ENV=production”
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Pythonスクリプト(定…

Pythonスクリプトをバックアップやデータ処理として定期実行したい場合、timerユニットと組み合わせます。まず、サービスファイル:

[Unit]
Description=Python Backup Script

[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /opt/scripts/backup.py
StandardOutput=journal
StandardError=journal

対応するtimerファイル(/etc/systemd/system/backup.timer):

[Unit]
Description=Run Backup Daily at 2 AM

[Timer]
OnCalendar=daily
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

カスタムWebサーバー(ユ…

ユーザーが個人で実行するサービスの場合、ユーザースコープのサービスファイルを使用します。ファイルは~/.config/systemd/user/myserver.serviceに配置:

[Unit]
Description=Personal Web Server
After=network-online.target

[Service]
Type=simple
ExecStart=/home/username/webserver/start.sh
Restart=on-failure

[Install]
WantedBy=default.target

ユーザースコープの有効化には、--userフラグが必要です:

systemctl –user enable myserver.service
systemctl –user daemon-reload

セキュリティ上の注意点

最小権限の原則

サービスは必ず必要最小限の権限で実行するべきです。rootユーザーでの実行は避け、専用の制限されたユーザーを作成することが推奨されます。サービスファイルのUser=Group=で指定します:

User=appuser
Group=appgroup

ファイルシステム保護

サービスが必要なディレクトリ以外にアクセスできないよう、保護を施すことが重要です。systemdは以下のディレクティブで制限できるとされています:

ReadOnlyPaths=/etc
ReadWritePaths=/var/log/myapp
ProtectSystem=strict
ProtectHome=yes

実装の詳細や最新の推奨設定については、公式ドキュメント(出典:systemd公式マニュアル)をご確認ください。

ログ管理とモニタリング

サービスの動作状況を把握するため、ジャーナル(journalctl)でログを定期的に確認することが推奨されます。異常な終了や再起動の頻度を監視することで、問題の早期発見につながります:

sudo journalctl -u myapp.service –since “1 day ago” -p warning

まとめ

systemdサービスの自動起動設定は、Linux管理の基本スキルです。本記事では、以下のポイントをお伝えしました:

  • systemdの基本概念とユニットタイプ
  • サービスファイルの作成から有効化までの手順
  • よくあるトラブルの原因と対処法
  • 実践的なサービスファイル例(Node.js、Python、ユーザースコープ)
  • セキュリティを考慮した実装方法

システムの安定運用には、適切なサービス管理が欠かせません。本記事で解説した設定方法を参考に、実際の環境に応じてカスタマイズしてください。問題が発生した場合は、journalctlコマンドでログを確認し、根本原因を特定することが重要です。

免責事項

本記事の情報は執筆時点のものです。systemdの仕様・コマンドオプション・セキュリティ上の推奨事項は、Linuxディストリビューションのバージョンやsystemdバージョンによって異なる可能性があります。本記事の設定例を本番環境に適用する際は、必ず公式ドキュメント(出典:systemd公式マニュアル、各Linuxディストリビューション公式ドキュメント)で最新情報をご確認の上、十分なテスト環境での動作検証を行ってください。セキュリティ設定に関しては、貴組織のセキュリティポリシーおよび専門家のご指導に従うことをお勧めします。


記事執筆完了

ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営