systemctlコマンド実践入門:Linuxサービス管理を完全マスター

Linuxシステムのサービス管理を効率化するなら、systemctlコマンドが最も強力なツールです。サービスの起動・停止・再起動・ステータス確認をワンストップで実行できるこのコマンドを使いこなせば、システム管理の生産性が飛躍的に向上します。

本記事では、systemctlコマンドの基本的な使い方から、実践的なトラブルシューティング、さらにはsystemdの高度な機能まで、具体的なコマンド例と共に徹底解説します。Linuxサーバー管理者必須のスキルを、この1記事で完全に習得してください。

目次

systemctlコマンド…

systemctlの基本的…

systemdとsyste…

サービス管理の実践テクニック

サービスの起動・停止・再起動

サービスステータスの詳細確認

サービスの自動起動設定

トラブルシューティングとデ…

サービス起動失敗時の対処法

ログ確認による問題特定

依存関係のトラブル解決

systemdの高度な機能活用

サービスユニットファイルの…

タイマーユニットによる定期実行

マスクと無効化の違いと使い分け

systemctlコマンド…

セキュリティ設定のベストプ…

パフォーマンス最適化のポイント

systemctlコマンド…

systemctlの基本的…

systemctlコマンドは、Linuxのsystemdサービス管理システムを操作するための主要なインターフェースです。基本的な構文は以下の通りです。

systemctl [オプション] [サブコマンド] [サービス名]

主なサブコマンドとその機能は以下の表の通りです。

サブコマンド機能使用例
startサービスを起動するsystemctl start nginx
stopサービスを停止するsystemctl stop nginx
restartサービスを再起動するsystemctl restart nginx
reloadサービス設定を再読み込み(サービスを停止しない)systemctl reload nginx
statusサービスの状態を詳細表示systemctl status nginx
enableサービスを自動起動に設定systemctl enable nginx
disableサービスの自動起動を無効化systemctl disable nginx
is-activeサービスが現在実行中か確認systemctl is-active nginx
is-enabledサービスが自動起動に設定されているか確認systemctl is-enabled nginx

主なオプションには以下のものがあります。

  • --user:ユーザー単位のサービス管理(systemd –user)
  • --now:サービスの起動と自動起動設定を同時に実行(例:systemctl enable --now nginx
  • --no-pager:出力をページャーなしで表示
  • --no-legend:ヘッダーやフッターを表示しない
  • --type=service:特定タイプのユニットのみ表示

例えば、nginxサービスを起動して自動起動も有効にする場合は以下のコマンドを実行します。

sudo systemctl enable --now nginx

systemdとsyste…

systemctlは、Linuxの初期化システムであるsystemdを操作するためのコマンドラインツールです。systemdは、従来のSysVinitに代わる現代的なinitシステムで、以下のような特徴があります。

  • 並列起動:サービスを同時に起動できるため、システム起動時間が大幅に短縮
  • 依存関係管理:サービス間の依存関係を自動的に解決
  • サービス管理:サービスの状態監視と自動再起動機能
  • リソース管理:cgroupsを使用したリソース制限
  • ユニット概念:サービスだけでなく、マウントポイント、デバイス、タイマーなども管理

systemdは、以下のようなユニットファイルでサービスを定義します。

/etc/systemd/system/サービス名.service

例えば、nginxサービスのユニットファイルは通常/lib/systemd/system/nginx.serviceにあります。このファイルを編集することで、サービスの動作をカスタマイズできます。

systemctlコマンドは、これらのユニットファイルを操作し、systemdに対してサービス管理の指示を出します。systemdは、これらの指示に基づいて実際のサービス管理を実行します。

サービス管理の実践テクニック

サービスの起動・停止・再起動

サービス管理の基本は、サービスの起動・停止・再起動です。これらの操作は、システムのメンテナンスやアプリケーションの更新時に頻繁に使用されます。

サービスの起動

サービスを起動するにはstartサブコマンドを使用します。

sudo systemctl start サービス名

例えば、Apache HTTP Serverを起動する場合は以下のように実行します。

sudo systemctl start apache2

サービスが正常に起動したかどうかは、statusサブコマンドで確認できます。

systemctl status apache2

出力例:

● apache2.service – The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-01-15 10:30:00 JST; 5min ago
Docs: https://httpd.apache.org/docs/2.4/
Main PID: 1234 (apache2)
Tasks: 55 (limit: 462)
Memory: 12.3M
CGroup: /system.slice/apache2.service
├─1234 /usr/sbin/apache2 -k start
├─1235 /usr/sbin/apache2 -k start
└─1236 /usr/sbin/apache2 -k start

サービスの停止

サービスを停止するにはstopサブコマンドを使用します。

sudo systemctl stop サービス名

例えば、MySQLサービスを停止する場合は以下のように実行します。

sudo systemctl stop mysql

サービスの再起動

サービスを再起動するにはrestartサブコマンドを使用します。これは、サービスを停止してから再起動するのと同じ効果があります。

sudo systemctl restart サービス名

例えば、PostgreSQLサービスを再起動する場合は以下のように実行します。

sudo systemctl restart postgresql

サービス設定の再読み込み

サービスを停止せずに設定を再読み込みするにはreloadサブコマンドを使用します。これは、Webサーバーなどの設定ファイルを更新した後に使用します。

sudo systemctl reload サービス名

例えば、Nginxの設定を再読み込みする場合は以下のように実行します。

sudo systemctl reload nginx

注意点:reloadがサポートされていないサービスもあります。その場合はrestartを使用する必要があります。

サービスステータスの詳細確認

サービスの状態を詳細に確認するにはstatusサブコマンドを使用します。このコマンドは、サービスの状態だけでなく、プロセスID、メモリ使用量、ログの一部など、多くの情報を提供します。

systemctl status サービス名

例えば、SSHサービスの状態を確認する場合は以下のように実行します。

systemctl status ssh

出力例:

● ssh.service – OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-01-15 09:15:23 JST; 2h ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 5678 (sshd)
Tasks: 1 (limit: 462)
Memory: 2.1M
CGroup: /system.slice/ssh.service
└─5678 /usr/sbin/sshd -D

Jan 15 09:15:23 server1 systemd: Started OpenBSD Secure Shell server.
Jan 15 09:15:23 server1 sshd[5678]: Server listening on 0.0.0.0 port 22.

status出力の主な項目:

  • Loaded:ユニットファイルのパスと状態(enabled/disabled)
  • Active:サービスの状態(active/inactive)と実行時間
  • Docs:関連するドキュメントへのリンク
  • Main PID:メインプロセスのID
  • Tasks:プロセス数とリソース制限
  • Memory:メモリ使用量
  • CGroup:cgroupsによるリソース制限情報
  • ログ:最近のログメッセージ

statusコマンドの出力をファイルに保存するには、以下のようにします。

systemctl status nginx > nginx_status.txt

また、statusコマンドの出力をJSON形式で取得するには、--output=jsonオプションを使用します。

systemctl status --output=json nginx

サービスの自動起動設定

システム起動時に自動的にサービスを起動するように設定するにはenableサブコマンドを使用します。逆に自動起動を無効にするにはdisableサブコマンドを使用します。

自動起動の有効化

sudo systemctl enable サービス名

例えば、Dockerサービスを自動起動に設定する場合は以下のように実行します。

sudo systemctl enable docker

これにより、システム起動時に自動的にDockerサービスが起動します。

自動起動の無効化

sudo systemctl disable サービス名

例えば、不要になったTomcatサービスの自動起動を無効にする場合は以下のように実行します。

sudo systemctl disable tomcat9

自動起動設定の確認

サービスが自動起動に設定されているかどうかを確認するにはis-enabledサブコマンドを使用します。

systemctl is-enabled サービス名

例えば、Cronサービスが自動起動に設定されているか確認する場合は以下のように実行します。

systemctl is-enabled cron

出力例:

enabled

また、サービスが現在実行中かどうかを確認するにはis-activeサブコマンドを使用します。

systemctl is-active サービス名

例えば、MariaDBサービスが実行中か確認する場合は以下のように実行します。

systemctl is-active mariadb

出力例:

active

自動起動と即時起動を同時に実行

--nowオプションを使用すると、サービスの自動起動設定と即時起動を同時に実行できます。

sudo systemctl enable --now サービス名

例えば、Redisサービスを自動起動に設定して即時起動する場合は以下のように実行します。

sudo systemctl enable --now redis-server

トラブルシューティングとデ…

サービス起動失敗時の対処法

サービスの起動に失敗した場合、原因を特定して適切に対処する必要があります。systemctlコマンドは、起動失敗時のトラブルシューティングに役立つ情報を提供します。

起動失敗の確認方法

サービスが起動に失敗した場合、statusコマンドの出力でActiveステータスがfailedと表示されます。

● nginx.service – A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Mon 2024-01-15 14:25:30 JST; 2min ago
Docs: man:nginx(8)
Process: 9876 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
Main PID: 9877 (code=exited, status=1/FAILURE)

失敗時の主な出力項目:

  • Active: failed:サービスが失敗状態であることを示す
  • Result: exit-code:プロセスが異常終了したことを示す
  • Process:失敗したプロセスとそのステータスコード
  • Main PID:失敗したメインプロセスのID

起動失敗の主な原因と対処法

原因確認方法対処法
設定ファイルのエラーsudo systemctl status サービス名でProcess項目を確認設定ファイルを修正し、systemctl daemon-reloadを実行
ポート番号の競合ss -tulnp | grep ポート番号でポート使用状況を確認競合しているサービスを停止するか、ポート番号を変更
依存関係の不足journalctl -u サービス名で詳細なエラーメッセージを確認不足しているパッケージをインストール
リソース不足dmesg | grep サービス名でカーネルメッセージを確認システムリソースを増強するか、サービスのリソース制限を調整
権限不足journalctl -u サービス名 -n 50で権限エラーを確認適切な権限を付与するか、サービスをroot権限で実行

具体的なトラブルシューティング手順

以下に、一般的なサービス起動失敗のトラブルシューティング手順を示します。

  1. statusコマンドで状態を確認
    sudo systemctl status サービス名
  2. 詳細なエラーメッセージを確認
    journalctl -u サービス名 -b

    -bオプションは、システム起動以降のログのみを表示します。

  3. 設定ファイルの構文チェック

    多くのサービスでは、設定ファイルの構文チェックが可能です。

    サービス名 -t
    例:nginx -t
  4. 依存関係の確認
    systemctl list-dependencies サービス名
  5. サービスのリロードと再起動

    設定ファイルを修正した後は、以下のコマンドで設定を再読み込みします。

    sudo systemctl daemon-reload
    sudo systemctl restart サービス名

ログ確認による問題特定

systemctlコマンドと連携して使用できるjournalctlコマンドは、systemdのジャーナルログを表示するための強力なツールです。サービスの起動失敗や動作中の問題を特定する際に非常に役立ちます。

基本的なjournalctlの使い方

サービス固有のログを表示するには以下のコマンドを使用します。

journalctl -u サービス名

例えば、MySQLサービスのログを表示する場合は以下のように実行します。

journalctl -u mysql

出力例:

— Logs begin at Mon 2024-01-15 09:00:00 JST, end at Mon 2024-01-15 15:30:00 JST. —
Jan 15 09:01:23 server1 systemd: Starting MySQL Community Server…
Jan 15 09:01:24 server1 mysqld[1234]: 2024-01-15T00:01:24.567890Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).
Jan 15 09:01:24 server1 systemd: Started MySQL Community Server.
Jan 15 14:25:30 server1 systemd: mysql.service: Main process exited, code=exited, status=1/FAILURE
Jan 15 14:25:30 server1 systemd: mysql.service: Failed with result ‘exit-code’.

ログのフィルタリング

journalctlでは、ログを様々な条件でフィルタリングできます。

  • 時間指定
    journalctl -u サービス名 --since "2024-01-15 10:00:00" --until "2024-01-15 12:00:00"
  • 優先度指定

    ログの優先度(-p)でフィルタリングできます。

    journalctl -u サービス名 -p err
    (err: エラー、warning: 警告、info: 情報、debug: デバッグ)
  • 逆順表示
    journalctl -u サービス名 -r
  • 最新のログのみ表示
    journalctl -u サービス名 -n
    【編集・制作ポリシー】
    本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
    ABOUT ME
    たから
    サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営