Linux systemctl: サービスの確認と管理

systemctlは、systemdによって管理されるサービスおよびその他のユニットのステータスを確認し、起動や停止を行い、ブート時に有効かどうかを設定するコマンドです。現在の実行中ステータスとブート時の有効ステータスは異なるため、それぞれを個別に確認する必要があります。

開始前

systemdはLinuxのシステムおよびサービスマネージャであり、管理するユニットにはサービス(.service)だけでなく、タイマーやソケットも含まれます。この記事では、systemdを使用してLinux上でシステムサービスを管理する方法を説明します。他の初期化システムを使用している環境やsystemdが実行されていない環境では、そのまま使用することはできません。詳細なコマンドについては、公式のsystemctlマニュアルを参照してください。

以下のapache2.serviceは、UbuntuにApacheがインストールされている場合の例です。インストールされていない場合、ユニットは見つからず、名前はディストリビューションによって異なる場合があります。実際のサービス名を確認してから練習を行い、稼働中のWebサーバーやリモートアクセスサービスを停止すると接続が切れる可能性があるため、安全なテスト環境で行ってください。状態の確認は通常ユーザーでも可能な場合が多いですが、システムサービスの変更には通常管理者権限が必要です。

サービスの状態と名前の確認

現在ロードされているサービスとインストールされているサービスユニットファイルを別々に確認してください。二つのリストは基準が異なるため、結果が同じでない場合があります。

systemctl list-units --type=service --all
systemctl list-unit-files --type=service

最初のコマンドは、非アクティブなユニットを含む systemd にロードされたサービスを表示します。2 つ目は、インストールされているサービスユニットファイルとその有効化状態を表示します。これはまだロードされていないサービスを見つけるのにも役立ちます。リストが長く、ページャーが開いた場合は、q を押して終了します。

例えば、Apache サービスのステータスと最近のログを確認するには、次のコマンドを入力します。

systemctl status apache2.service
systemctl is-active apache2.service
systemctl is-enabled apache2.service

status の出力では、Active: active (running) はサービスが現在実行中であることを意味し、inactive は非アクティブ、failed は失敗したことを意味します。詳細な状態はサービスの種類によって異なります。is-active は現在のステータスを確認し、is-enabled は有効化状態を確認します。static ユニットは通常の方法では有効化できませんが、他のユニットによって起動することは可能です。

サービスの開始、停止、再起動

以下のコマンドは実際にサービスの状態を変更します。例として示したサービス名を、システムに適したものに置き換え、実行前にサービスの停止が問題ないことを確認してください。

sudo systemctl start apache2.service
sudo systemctl stop apache2.service
sudo systemctl restart apache2.service

start はサービスを開始し、stop は停止します。restart はサービスを停止してから再起動し、停止しているサービスも開始できます。必要なコマンドのみを実行してください。各操作後は systemctl status apache2.service で結果を確認してください。すでに実行中のサービスでも、再起動中に接続が一時的に切れる場合があります。

サービスが自身の設定のリロードをサポートしている場合、sudo systemctl reload apache2.service を使用して設定を再適用できます。サポートの有無や適用方法はサービスごとに異なります。リロードと再起動は同じ動作ではなく、設定の確認方法はサービスのドキュメントに従う必要があります。

起動時の有効化と現在の稼働状況

以下のコマンドは、ユニットが起動プロセス中に起動するように接続の設定や削除を行います。enable を単独で実行しても、直ちに何かが起動するわけではなく、disable を単独で実行しても、すでに稼働中のサービスを直ちに停止するわけではありません。

sudo systemctl enable apache2.service
sudo systemctl disable apache2.service
systemctl is-enabled apache2.service

必要なコマンドのみを選択して実行し、最後のコマンドで結果を確認してください。enabled は有効化用で、disabled は無効化用です。ただし、他のユニットやソケット/タイマーからの依存関係によりサービスが依然として起動する場合があるため、disable をすべての起動経路をブロックするものと解釈しないでください。

即時に有効化して開始するには sudo systemctl enable --now apache2.service を使用し、即時に無効化して停止するには sudo systemctl disable --now apache2.service を使用してください。各コマンドの効果を確認し、テスト環境でのみ練習してください。

問題が発生したときに確認すること

失敗したユニットの一覧と特定のサービスの最近のログを確認してください。ログには機密情報が含まれる場合があるため、共有する前に内容を確認してください。

systemctl --failed
sudo journalctl -u apache2.service -n 50 --no-pager

サービスが見つからない場合は、その名前とインストールされているかどうかを確認してください。起動に失敗した場合は、設定エラー、依存サービス、ポートの競合、または権限の問題についてstatusおよびログを確認してください。maskedのステータスは起動がブロックされていることを示しているため、原因を特定する前に安易にマスクを解除しないでください。メッセージと解決策は、ディストリビューションやサービス設定によって異なる場合があります。

ユニットファイルを変更した場合

systemdユニットファイルやドロップイン設定を変更した場合は、systemdにユニット定義を再読み込みさせるために次のコマンドを使用してください。

sudo systemctl daemon-reload

このコマンドは、サービス自体を再起動したり、サービスに構成ファイルの再読み込みをさせるものではありません。実行中のサービスに変更を適用する必要がある場合は、サービスおよび変更に適した別の再起動またはリロードが必要になることがあります。変更を行う前に構成をバックアップし、元の状態に戻す方法を確認してください。