systemdサービス自動起動の設定方法

※本記事はプロモーションを含みます。
systemdサービスの自動起動設定は、LinuxシステムにおけるOS管理の基本スキルです。本記事では、サーバー管理・デバイス運用に携わるシステム管理者向けに、実践的な設定方法からトラブルシューティングまでを解説します。読了時間:約8~10分。
目次
- systemdとは何か
- 基本的な自動起動設定の流れ
- よくあるトラブルと対処法
- 実践例:複数サービスの設定
- セキュリティ上の注意点
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ディストリビューション公式ドキュメント)で最新情報をご確認の上、十分なテスト環境での動作検証を行ってください。セキュリティ設定に関しては、貴組織のセキュリティポリシーおよび専門家のご指導に従うことをお勧めします。
—




