目次
- systemdとは?Linuxの起動とサービス管理の中核
- systemdが管理するもの
- 「ユニット」という概念
- systemctlの基本操作|サービスの起動・停止・確認
- サービスの状態確認
- サービスの起動・停止・再起動
- サービスの自動起動設定
- 自動起動設定の確認
- サービス一覧の確認と管理
- 稼働中のサービス一覧
- 自動起動が設定されたサービス一覧
- 不要なサービスの無効化
- ユニットファイルの構造と読み方
- ユニットファイルの配置場所
- ユニットファイルの構成
- 独自サービスの作成|自社アプリケーションをsystemdで管理する
- バックアップスクリプトのサービス化
- タイマーユニットの作成
- Webアプリケーションのサービス化
- トラブルシューティング|サービスが起動しない場合の対処法
- ステップ1:サービスの状態確認
- ステップ2:ログの詳細確認
- ステップ3:ユニットファイルの構文チェック
- ステップ4:依存関係の確認
- よくある問題と解決策
- まとめ|systemdはLinuxサーバー管理の基礎スキル
Linuxサーバーを運用する上で、「Webサーバーを起動する」「データベースを再起動する」「サービスの自動起動を設定する」といった操作は日常的に行います。これらのサービス管理を担うのが「systemd」です。
systemdは、現在のほぼすべての主要Linuxディストリビューションで採用されている初期化システム(initシステム)であり、サーバーの起動からサービスの管理、ログの収集まで幅広い機能を提供します。
本記事では、systemdの基本概念からsystemctlコマンドの実践的な使い方、独自サービスの作成方法まで体系的に解説します。Linuxの基礎と基本コマンドを理解していることを前提としています。
systemdとは?Linuxの起動とサービス管理の中核
systemdは、Linux起動時に最初に実行されるプロセス(PID 1)であり、システム全体のプロセス管理を統括するシステムです。2010年にLennart Poettering氏とKay Sievers氏によって開発が始まり、現在ではUbuntu、Rocky Linux、AlmaLinux、Debian、Fedoraなど、ほぼすべての主要ディストリビューションで標準採用されています。
systemdが管理するもの
systemdは単なるサービス管理ツールではなく、以下の機能を包括的に提供します。
サービス(デーモン)管理:Webサーバー、データベース、SSHサーバーなどの起動・停止・再起動を管理します。
システム起動プロセス:PCの電源が入ってからログイン画面が表示されるまでの起動シーケンスを制御します。
ログ管理(journald):システム全体のログを一元管理します。詳しくはLinuxのログ管理ガイドで解説しています。
タイマー機能:cronの代替となるタスクスケジューリング機能を提供します。
マウント管理:ファイルシステムのマウントを管理します。
ネットワーク管理:ネットワークインターフェースの設定と管理を行います。
「ユニット」という概念
systemdが管理するすべてのリソースは「ユニット(Unit)」と呼ばれます。ユニットには複数の種類があり、ファイルの拡張子で区別されます。
.service:サービス(デーモン)を定義。最も頻繁に扱うユニットタイプです。
.timer:タイマー(定期実行タスク)を定義。
.socket:ソケットベースのアクティベーションを定義。
.target:複数のユニットをグループ化する論理的な単位。
.mount:ファイルシステムのマウントポイントを定義。
.path:ファイルやディレクトリの監視を定義。
サーバー管理の日常業務では、主に .service ユニットを操作することになります。
systemctlの基本操作|サービスの起動・停止・確認
systemdを操作するためのコマンドが systemctl です。サーバー管理者が最も頻繁に使うコマンドの一つであり、その基本操作を確実に覚えましょう。
サービスの状態確認
特定のサービスの現在の状態を確認するには、以下のコマンドを使用します。
systemctl status nginx
このコマンドは、サービスの稼働状態、プロセスID、メモリ使用量、最近のログなど、サービスに関する包括的な情報を表示します。出力の主な項目を説明します。
Active:active (running) は正常稼働中、inactive (dead) は停止中、failed は異常停止を示します。
Main PID:サービスのメインプロセスのIDです。プロセス管理の知識があるとトラブルシューティングに役立ちます。
CGroup:サービスが属するコントロールグループと、その配下のプロセスが表示されます。
ログ出力:最新のログメッセージが数行表示されます。
サービスの起動・停止・再起動
サービスの起動:
sudo systemctl start nginx
サービスの停止:
sudo systemctl stop nginx
サービスの再起動:
sudo systemctl restart nginx
設定のリロード(プロセスを停止せずに設定を再読み込み):
sudo systemctl reload nginx
reload は、設定変更を反映する際にダウンタイムなしで行えるため、本番環境では restart よりも優先して使うべきです。ただし、すべてのサービスが reload に対応しているわけではありません。
条件付きリスタート(稼働中の場合のみ再起動):
sudo systemctl try-restart nginx
サービスの自動起動設定
サーバーの再起動後にサービスが自動的に起動するよう設定するのが enable コマンドです。
自動起動を有効にする:
sudo systemctl enable nginx
自動起動を無効にする:
sudo systemctl disable nginx
自動起動の有効化と同時にサービスを起動する:
sudo systemctl enable --now nginx
enable はあくまで「次回起動時の自動起動設定」であり、今すぐサービスを起動する場合は start も合わせて実行する必要があります。--now オプションを使えば両方を一度に行えます。
自動起動設定の確認
systemctl is-enabled nginx
enabled と表示されれば自動起動が有効、disabled と表示されれば無効です。
サービス一覧の確認と管理
サーバー上で動作しているサービスの全体像を把握することは、運用管理の基本です。
稼働中のサービス一覧
systemctl list-units --type=service
このコマンドはロードされたサービスユニットの一覧を表示します。--state=running を追加すると、現在稼働中のサービスのみに絞り込めます。
systemctl list-units --type=service --state=running
自動起動が設定されたサービス一覧
systemctl list-unit-files --type=service
各サービスの自動起動設定(enabled / disabled / static / masked)を確認できます。
static:他のサービスから依存関係で起動されるが、単独での自動起動設定は行えないサービス。
masked:手動でも自動でも起動できないように完全に無効化されたサービス。
不要なサービスの無効化
セキュリティとパフォーマンスの観点から、不要なサービスは無効化しておくべきです。
sudo systemctl disable --now bluetooth.service
サーバー環境では、Bluetooth、プリンター関連、デスクトップ環境関連などのサービスは通常不要です。ただし、依存関係のあるサービスを安易に停止すると問題が発生する可能性があるため、事前に依存関係を確認してください。
systemctl list-dependencies nginx.service
このコマンドで、指定したサービスが依存する他のサービスをツリー形式で確認できます。
ユニットファイルの構造と読み方
systemdのサービスがどのように定義されているかを理解することで、トラブルシューティングやカスタマイズが容易になります。
ユニットファイルの配置場所
ユニットファイルは主に2つの場所に配置されています。
/usr/lib/systemd/system/:パッケージマネージャーによってインストールされたデフォルトのユニットファイル。直接編集しないでください。
/etc/systemd/system/:管理者がカスタマイズまたは新規作成するユニットファイル。こちらが優先されます。
既存のサービスの設定を変更したい場合は、元のファイルを直接編集するのではなく、systemctl edit コマンドを使用します。
sudo systemctl edit nginx.service
これにより、オーバーライド用の設定ファイルが自動的に作成され、元の設定を安全にカスタマイズできます。
ユニットファイルの構成
典型的なサービスのユニットファイルは、3つのセクションで構成されています。
[Unit]セクション:サービスの説明と依存関係を定義します。
Description= にはサービスの説明を記述します。After= には、このサービスの前に起動しておくべきユニットを指定します。例えば、Webサーバーであれば After=network.target と記述して、ネットワークが利用可能になった後に起動するようにします。
[Service]セクション:サービスの動作を定義する中核部分です。
Type= にはサービスの種類を指定します。主なタイプは以下の通りです。
simple:ExecStartで指定したプロセスがメインプロセスとなる(デフォルト)。
forking:メインプロセスがフォークして子プロセスを起動するデーモン向け。
oneshot:起動時に一度だけ実行して終了するタスク向け。
ExecStart= にはサービスの起動コマンドを指定します。
ExecReload= には設定リロード時のコマンドを指定します。
Restart= にはサービスの自動再起動ポリシーを指定します。always、on-failure、on-abnormal などの値を設定できます。
[Install]セクション:自動起動の設定を定義します。
WantedBy=multi-user.target と記述すると、通常のマルチユーザーモードで自動起動されるようになります。
独自サービスの作成|自社アプリケーションをsystemdで管理する
自社で開発したアプリケーションやスクリプトをsystemdのサービスとして管理する方法を解説します。これにより、自動起動、ログ管理、異常時の自動再起動といったsystemdの恩恵を受けられます。
バックアップスクリプトのサービス化
例として、毎日実行するバックアップスクリプトをsystemdのサービスとタイマーで管理する方法を示します。
まず、バックアップスクリプト(/usr/local/bin/backup.sh)が既に作成されていると仮定します。シェルスクリプトの書き方はシェルスクリプト入門を参照してください。
サービスユニットファイルを作成します。Vimエディタで以下の内容を記述します。
sudo vim /etc/systemd/system/backup.service
[Unit]セクションに Description=Daily Backup Service と記述し、[Service]セクションに Type=oneshot、ExecStart=/usr/local/bin/backup.sh と記述します。ファイルのパーミッション設定についてはパーミッションガイドを確認してください。
タイマーユニットの作成
cronの代わりにsystemdのタイマーを使って定期実行を設定します。
sudo vim /etc/systemd/system/backup.timer
[Unit]セクションに Description=Run Backup Daily、[Timer]セクションに OnCalendar=*-*-* 03:00:00(毎日午前3時に実行)、Persistent=true(前回の実行をスキップした場合に即実行)を設定し、[Install]セクションに WantedBy=timers.target を記述します。
タイマーを有効にします。
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
cronとsystemdタイマーの使い分けについてはcronスケジューリングガイドで詳しく解説しています。
Webアプリケーションのサービス化
Node.jsやPythonで開発したWebアプリケーションをsystemdで管理する場合の例を紹介します。
sudo vim /etc/systemd/system/myapp.service
[Unit]セクションで Description=My Web Application、After=network.target を指定します。[Service]セクションでは Type=simple、User=www-data(実行ユーザー)、WorkingDirectory=/opt/myapp(作業ディレクトリ)、ExecStart=/usr/bin/node /opt/myapp/server.js(起動コマンド)を指定します。
また、Restart=on-failure と RestartSec=5 を設定することで、アプリケーションが異常終了した場合に5秒後に自動的に再起動されます。
環境変数を設定する必要がある場合は、Environment=NODE_ENV=production のようにユニットファイル内で直接指定するか、EnvironmentFile=/opt/myapp/.env のように外部ファイルから読み込む方法があります。
設定後、デーモンのリロードとサービスの有効化を行います。
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
トラブルシューティング|サービスが起動しない場合の対処法
サービスが期待通りに動作しない場合の調査手順を解説します。
ステップ1:サービスの状態確認
systemctl status サービス名
出力の Active 行で状態を確認します。failed と表示されている場合は、下部に表示されるログメッセージから原因の手がかりを探します。
ステップ2:ログの詳細確認
journalctl -u サービス名 -n 50 --no-pager
指定したサービスの最新50行のログを表示します。-f オプションを付けるとリアルタイムでログを監視できます。
journalctl -u サービス名 -f
ログの見方に慣れることは、サーバー管理者にとって非常に重要です。ログ管理ガイドで基礎知識を身につけてください。
ステップ3:ユニットファイルの構文チェック
systemd-analyze verify /etc/systemd/system/myapp.service
ユニットファイルに構文エラーがないか検証します。問題がある場合はエラーメッセージが表示されます。
ステップ4:依存関係の確認
systemctl list-dependencies サービス名
依存するサービスの中に起動していないものがないか確認します。
よくある問題と解決策
「ExecStart= でコマンドが見つからない」:フルパスでコマンドを指定しているか確認してください。systemdはPATH環境変数を参照しないため、/usr/bin/node のようにフルパスで記述する必要があります。
「権限がない」エラー:実行ユーザー(User=)に適切な権限があるか、対象ファイルのパーミッションが正しいか確認してください。ファイルパーミッションガイドが参考になります。
「ポートが既に使用中」:別のプロセスが同じポートを使用している可能性があります。ss -tlnp コマンドで使用中のポートを確認してください。ネットワークコマンドの知識が役立ちます。
daemon-reloadの忘れ:ユニットファイルを変更した後は、必ず sudo systemctl daemon-reload を実行してください。これを忘れると変更が反映されません。
まとめ|systemdはLinuxサーバー管理の基礎スキル
systemdとsystemctlの操作は、Linuxサーバーを管理する上で避けて通れない基本スキルです。本記事で解説した内容を実践すれば、日常のサービス管理から独自アプリケーションのデーモン化まで対応できるようになります。
本記事のポイントを整理します。
日常運用で必須のコマンド
systemctl status:サービスの状態確認systemctl start / stop / restart:サービスの起動・停止・再起動systemctl enable / disable:自動起動の設定journalctl -u:サービス固有のログ確認
カスタマイズ・応用
- ユニットファイルの構造([Unit]、[Service]、[Install])の理解
- 独自サービスの作成とタイマーによる定期実行
Restart=on-failureによる自動復旧の設定
systemdの知識は、Ubuntu Serverの初期設定、Nginxのセットアップ、Dockerの運用など、あらゆるサーバー管理場面で活かされます。
サーバーのセキュリティ強化に取り組む際はセキュリティ強化ガイドを、パフォーマンスの最適化についてはパフォーマンス監視ガイドを、クラウド環境での運用はクラウドサーバー(AWS)ガイドをそれぞれ参照してください。systemdを使いこなすことで、Linuxサーバーの運用品質は確実に向上します。
先行モニター企業 募集中|先着5社・2026年11月末まで 生成AIの利用費、「誰が・何のために・いくら」まで見えていますか?
株式会社カイダンと共同開発したAI利用ガバナンスSaaS「ManageAI」は、OpenAI・Azure OpenAI・Claude・AWS Bedrock・Google Vertex AIの費用と利用状況を、部署・利用者・プロジェクト別に可視化します。導入は読み取り専用キーの登録だけ。初期費用0円・月額5万円(税別)で先行モニター企業を募集しています。
ニュースリリースを読む関連記事
Related / 9 articles
Notes & Insights
- プログラミング
DDoS攻撃の仕組みと対策入門|レイヤー別の防御とCDN・クラウドの活用
DDoS攻撃をボリューム型・プロトコル型・アプリ層に分けて仕組みを解説し、自前サーバーで防げない理由、CloudflareやAWS Shieldの標準防御、オリジンIPの隠し方、レートリミットとBot対策、攻撃を受けたときの初動、費用が跳ね上がるDenial of Walletへの備えまでわかります。
- プログラミング
WAFとは?仕組み・導入パターン・誤検知対策|Webアプリを攻撃から守る実践ガイド
WAFがファイアウォールやIDSと何が違うのか、シグネチャとマネージドルールの仕組み、Cloudflare WAF・AWS WAF・ModSecurityの比較、フォーム送信がブロックされる誤検知の調査と例外設定、ログ監視、WAFが代替できないことまで実践的に解説します。
- プログラミング
セキュリティヘッダー入門|CSP・HSTS・X-Frame-Optionsの設定と効果を実践解説
CSP・HSTS・X-Frame-Options・X-Content-Type-Optionsなど主要セキュリティヘッダーが防ぐ攻撃と、CSPのReport-Onlyからの段階導入、nonce/hash、HSTS preloadの不可逆リスク、Nginx・Next.js・Astroでの設定例、確認方法を解説します。
- プログラミング
クラウドの通信費(Egress)入門|データ転送量課金の仕組みと転送コストを抑える設計
クラウドの「受信無料・送信有料」の原則、AZ間・リージョン間・インターネット向けの単価差、NATゲートウェイ処理料の罠、CDNで転送量を減らす方法、バックアップやログ転送の見落とし、請求書で転送料を特定する手順を解説。想定外の請求を防げます。
- プログラミング
秘密情報をGitに入れない仕組み|.gitignore・git-secrets・履歴から漏れた鍵の削除
APIキーや.envをGitにコミットしてしまう典型経路と、.gitignore・.env.exampleの運用、pre-commitでのgitleaks検知、GitHub secret scanningの活用、漏れた鍵の無効化と履歴書き換え(git filter-repo)の手順を解説。仕組みで再発を防げます。
- プログラミング
開発・ステージング・本番環境の分離設計|環境差分をなくす構成とアクセス制御
開発・ステージング・本番それぞれの目的と、構成をコードで揃える方法、環境別の設定注入、本番データを使わないテストデータ戦略、ステージングの保護(Basic認証・IP制限・noindex)、コストを抑える運用までを解説。環境差分による本番障害を防げます。
- プログラミング
ngrok・Cloudflare Tunnelでローカルを公開|Webhook開発とデモ環境の作り方
NAT内のローカル環境にStripeやLINEのWebhookを届けるトンネリングの仕組みを解説。ngrok・Cloudflare Tunnel・localtunnelの比較、固定ドメインと認証、リクエスト検査、公開時のセキュリティ、自宅サーバー公開への応用までわかります。
- プログラミング
ローカル開発環境のHTTPS化|mkcert・hostsファイル・自己署名証明書の正しい使い方
ローカル開発をHTTPS前提にすべき理由(Secure Cookie・Service Worker・OAuth)と、mkcertでローカルCAを作りhostsで独自ドメインを割り当ててVite・Next.js・Dockerで使う手順を解説。証明書警告を無視する癖の危険も理解できます。
- プログラミング
localhost・0.0.0.0・127.0.0.1の違い|ポートとUnixソケットを理解して「つながらない」を解決
localhost・127.0.0.1・0.0.0.0の意味の違い、Dockerで外から接続できない原因、host.docker.internal、ポート競合の調べ方、Unixソケットの利点と権限、1024未満ポートの制約を解説。「つながらない」を仕組みから解決できます。
先行モニター企業 募集中
生成AIのコストを「部署別」に、請求書より先に。
先着5社限定・2026年11月末まで。初期費用0円・月額5万円(税別)で、正式版と同等の機能に加え、開発者と伴走者による導入支援を追加費用なしで提供します。プロンプト原文は一切取得しません。
株式会社カイダン × Harmonic Society株式会社の共同事業|読み取り専用キーの登録だけで導入できます