🎯 この記事で学べること
- 1`systemctl`コマンドの基本的な使い方をマスターできます
- 2サービスの起動・停止・再起動の操作方法がわかります
- 3システム起動時の自動起動設定(enable/disable)を理解できます
- 4ユニットファイルの作成とカスタマイズ方法が身につきます
- 5journalctlと連携したログ確認とトラブルシューティングができるようになります
読了時間: 約10分
systemctlとは
みなさん、Webサーバーやデータベースなどのサービスを手動で起動・停止していませんか?システム起動時に自動的にサービスを開始したいと思ったことはありませんか?
systemctl
は、systemd(システムデーモン)を使用するLinuxディストリビューションで、システムサービスとユニットを管理するための強力なコマンドです。これを使えば、サービスの起動・停止、自動起動の設定、状態確認など、システム管理に必要な操作を簡単に行えるんです!
今回は、システム管理の要となるsystemctl
の使い方を、実践的な例を交えながら学んでいきましょう!
systemdの基本概念
ユニットとは
systemdでは、管理対象を「ユニット」と呼びます。これがsystemdの基本単位なんですね!
主なユニットタイプを見てみましょう:
- service - システムサービス(最も一般的、nginxやsshdなど)
- socket - ソケット(ネットワーク接続の待ち受け)
- device - デバイス(ハードウェアデバイス)
- mount - マウントポイント(ファイルシステムのマウント)
- automount - 自動マウントポイント(アクセス時に自動マウント)
- target - ユニットのグループ(旧runlevelに相当)
- timer - タイマーベースの実行(cronの代替)
# systemdユニットタイプの例
echo 'nginx.service - Webサーバー'
echo 'ssh.socket - SSHソケット'
echo 'multi-user.target - マルチユーザーターゲット'
基本的な使い方
サービスの状態確認
まずは、サービスの状態を確認する方法から見ていきましょう!
# 特定サービスの状態を確認
$ systemctl status nginx
# すべてのサービス一覧
$ systemctl list-units --type=service
# 実行中のサービスのみ表示
$ systemctl list-units --type=service --state=running
出力例:
● nginx.service - A high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
Active: active (running) since Mon 2025-08-08 10:00:00 JST
Main PID: 1234 (nginx)
statusコマンドでは、サービスの有効/無効状態(enabled/disabled)、実行状態(active/inactive)、プロセスID、最近のログなどが表示されます。これらの情報がトラブルシューティングに役立ちますよ!
サービスの起動・停止
次に、サービスを実際に操作してみましょう。とても簡単ですよ!
# サービスを起動
$ sudo systemctl start nginx
# サービスを停止
$ sudo systemctl stop nginx
# サービスを再起動
$ sudo systemctl restart nginx
# 設定ファイルを再読み込み(サービスを停止せずに)
$ sudo systemctl reload nginx
reload
は設定ファイルだけを再読み込みするので、サービスを停止せずに設定変更を反映できます。Webサーバーなど、停止できないサービスで便利ですね!
自動起動の設定
システム起動時にサービスを自動的に開始したい場合の設定方法です。これは非常に重要な機能ですね!
# 自動起動を有効化(システム起動時に自動的に開始)
$ sudo systemctl enable nginx
# 自動起動を無効化
$ sudo systemctl disable nginx
# 現在の自動起動設定を確認
$ systemctl is-enabled nginx
# 有効化と起動を同時に実行(便利!)
$ sudo systemctl enable --now nginx
--now
オプションを使うと、enableとstartを同時に実行できます。これでコマンドを2回打つ必要がなくなりますよ!
サービスの詳細確認
サービスの依存関係
サービスは他のサービスやターゲットに依存していることがあります。この依存関係を確認してみましょう!
# サービスの依存関係を表示
$ systemctl list-dependencies nginx
# 逆依存関係(このサービスに依存するもの)
$ systemctl list-dependencies nginx --reverse
# すべての依存関係をツリー表示
$ systemctl list-dependencies
出力例:
nginx.service
├─network.target
├─remote-fs.target
└─system.slice
これで、nginxがネットワークとリモートファイルシステムに依存していることがわかりますね!
サービスのプロパティ
# サービスの全プロパティを表示
$ systemctl show nginx
# 特定のプロパティのみ表示
$ systemctl show nginx -p MainPID
$ systemctl show nginx -p ActiveState
$ systemctl show nginx -p SubState
ユニットファイルの管理
ユニットファイルの場所
サービスの動作はユニットファイルで定義されています。このファイルを確認・編集する方法を学びましょう!
# ユニットファイルの場所を確認
$ systemctl cat nginx.service
# ユニットファイルの編集(オーバーライドファイルを作成)
$ sudo systemctl edit nginx.service
# 編集内容を破棄して元に戻す
$ sudo systemctl revert nginx.service
systemctl edit
は元のファイルを直接編集せず、オーバーライドファイルを作成します。これで安全にカスタマイズできますよ!
ユニットファイルの構造
ユニットファイルは3つのセクションで構成されています:
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
各セクションの役割:
- [Unit] - サービスの説明と依存関係
- [Service] - サービスの実行方法
- [Install] - 自動起動の設定
実践的な使い方
新しいサービスの作成
独自のアプリケーションをサービスとして登録してみましょう!これができるようになると、システム管理が格段に楽になりますよ!
# カスタムサービスファイルを作成
$ sudo nano /etc/systemd/system/myapp.service
以下のような内容でファイルを作成します:
[Unit]
Description=My Application Service
After=network.target
[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
次に、サービスを有効化して起動します:
# systemdに新しいサービスを認識させる
$ sudo systemctl daemon-reload
# サービスを起動
$ sudo systemctl start myapp
# 自動起動を有効化
$ sudo systemctl enable myapp
Restart=always
を設定すると、プロセスが異常終了しても自動的に再起動されます。安定したサービス運用に必須の設定ですね!
サービスの監視と自動再起動
[Service]
# 異常終了時の自動再起動
Restart=on-failure
RestartSec=5s
# 再起動の最大試行回数
StartLimitBurst=3
StartLimitIntervalSec=60s
# メモリ制限
MemoryLimit=512M
# CPU使用率制限
CPUQuota=50%
タイマーユニットの使用
# タイマーユニットの作成(cronの代替)
$ sudo nano /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
# タイマーの有効化と起動
$ sudo systemctl enable --now backup.timer
# タイマーの一覧表示
$ systemctl list-timers
ログの確認
journalctlとの連携
systemdはjournaldというログシステムと統合されています。journalctl
コマンドでサービスのログを簡単に確認できるんです!
# サービスのログを表示
$ journalctl -u nginx
# 最新のログをフォロー(リアルタイム監視)
$ journalctl -u nginx -f
# 特定期間のログ
$ journalctl -u nginx --since "2025-08-08 10:00:00"
$ journalctl -u nginx --since "1 hour ago"
# エラーログのみ表示
$ journalctl -u nginx -p err
出力例:
Aug 08 10:00:00 server systemd[1]: Starting nginx.service...
Aug 08 10:00:01 server nginx[1234]: nginx: configuration file test successful
Aug 08 10:00:01 server systemd[1]: Started nginx.service.
-f
オプションを使うと、新しいログエントリがリアルタイムで表示されます。トラブルシューティング時に非常に便利ですよ!
システムターゲットの管理
ランレベルとターゲット
# 現在のターゲットを確認
$ systemctl get-default
# デフォルトターゲットを変更
$ sudo systemctl set-default multi-user.target
# 利用可能なターゲット一覧
$ systemctl list-units --type=target
# 特定のターゲットに切り替え
$ sudo systemctl isolate multi-user.target
主要なターゲット
- poweroff.target - システムシャットダウン
- rescue.target - レスキューモード
- multi-user.target - マルチユーザーモード(CUI)
- graphical.target - グラフィカルモード(GUI)
- reboot.target - システム再起動
トラブルシューティング
サービスが起動しない場合
サービスが起動しない時は、落ち着いて順番に原因を調べていきましょう!
# 詳細なステータス確認
$ systemctl status -l nginx
# 失敗したサービスの一覧
$ systemctl list-units --failed
# サービスの起動失敗理由を確認
$ journalctl -xe -u nginx
# 設定ファイルの検証
$ sudo nginx -t
依存関係の問題
依存関係が原因で起動しないこともあります。以下の方法で調査できます:
# 依存関係の確認
$ systemctl list-dependencies nginx
# 起動順序の確認(SVGファイルで視覚化)
$ systemd-analyze plot > bootup.svg
# 起動時間の分析(遅いサービスを特定)
$ systemd-analyze blame
サービスが起動しない最も一般的な原因は、設定ファイルのエラーです。まずはアプリケーション固有の設定ファイルをチェックしましょう!
セキュリティ設定
サービスの隔離
[Service]
# プライベート/tmpディレクトリ
PrivateTmp=true
# 読み取り専用のルートファイルシステム
ReadOnlyPaths=/
# 書き込み可能なパス
ReadWritePaths=/var/lib/myapp
# ネットワークの隔離
PrivateNetwork=true
# システムコールのフィルタリング
SystemCallFilter=@basic-io @network-io
リソース制限
[Service]
# メモリ制限
MemoryLimit=1G
MemoryAccounting=true
# CPU制限
CPUQuota=50%
CPUAccounting=true
# ファイルディスクリプタ制限
LimitNOFILE=65536
# プロセス数制限
LimitNPROC=4096
高度な機能
ソケットアクティベーション
# ソケットユニットの作成
$ sudo nano /etc/systemd/system/myapp.socket
[Unit]
Description=My App Socket
[Socket]
ListenStream=8080
[Install]
WantedBy=sockets.target
テンプレートユニット
# テンプレートサービスの作成
$ sudo nano /etc/systemd/system/myapp@.service
[Unit]
Description=My App Instance %i
[Service]
Type=simple
ExecStart=/usr/bin/myapp --instance=%i
Restart=always
[Install]
WantedBy=multi-user.target
# インスタンスの起動
$ sudo systemctl start myapp@1
$ sudo systemctl start myapp@2
$ sudo systemctl enable myapp@{1..3}
ベストプラクティス
サービスファイルの書き方
[Unit]
# わかりやすい説明を記載
Description=Production Web Application
# 適切な依存関係を設定
After=network.target postgresql.service
Requires=postgresql.service
[Service]
# 適切なタイプを選択
Type=notify
# セキュリティ設定
User=webapp
Group=webapp
NoNewPrivileges=true
# 環境変数
Environment="NODE_ENV=production"
EnvironmentFile=/etc/myapp/environment
# 再起動ポリシー
Restart=on-failure
RestartSec=5s
# リソース制限
MemoryLimit=2G
CPUQuota=200%
[Install]
WantedBy=multi-user.target
監視とアラート
#!/bin/bash
# service_monitor.sh
SERVICE="nginx"
EMAIL="admin@example.com"
if ! systemctl is-active --quiet $SERVICE; then
echo "Service $SERVICE is not running" | mail -s "Service Alert" $EMAIL
systemctl start $SERVICE
fi
# 自動再起動の失敗を検知
if systemctl is-failed --quiet $SERVICE; then
echo "Service $SERVICE has failed" | mail -s "Service Failed" $EMAIL
fi
コマンドリファレンス
よく使うコマンド一覧
# サービス管理
systemctl start/stop/restart/reload SERVICE
systemctl enable/disable SERVICE
systemctl status SERVICE
systemctl is-active/is-enabled SERVICE
# システム管理
systemctl daemon-reload
systemctl reboot/poweroff/suspend/hibernate
# 情報表示
systemctl list-units
systemctl list-unit-files
systemctl list-dependencies
systemctl show SERVICE
# ログ確認
journalctl -u SERVICE
journalctl -f
journalctl --since "TIME"
🎮 理解度チェック
📝 まとめ
今回はsystemctl
コマンドについて学びました!
systemctl
はsystemdベースのLinuxでサービスを管理する中核ツール- start/stop/restart/reloadでサービスの基本操作ができる
- enable/disableでシステム起動時の自動起動を制御する
- ユニットファイルでサービスの動作を詳細に定義できる
- journalctlと連携してログの確認とトラブルシューティングが可能
次はSSHコマンドで、リモートサーバーへの安全な接続方法を学びましょう!