はじめに
プロセスとは、実行中のプログラムです。サービスとは、定義とライフサイクルポリシーに従って管理される、長時間稼働するシステム機能です。Ubuntu では、systemd がユニット定義を読み込み、サービスの起動・停止、状態の追跡を行い、出力をシステムジャーナルに記録します。
この実験では、分離された labex-heartbeat 練習用サービスを使用します。ユニットの内容を確認し、実行時状態を制御し、起動時の有効化を設定し、ジャーナルと従来型のテキストログを検索します。さらに、リアルタイム出力の追跡、意図的に発生させた障害の診断、正常な状態への復旧も行います。ユニットファイルの編集や SSH サービスへの変更は行いません。
systemd とサービスユニットを確認する
このステップでは、systemd が利用可能であることを確認し、実行中のユニットとインストール済みのユニットファイルの違いを確認します。
実験用ワークスペースに移動します。
cd /home/labex/project/service-lab
systemd のバージョンを表示します。識別には最初の行だけで十分です。
systemctl --version | head -n 1
systemd 全体の状態を確認します。
systemctl is-system-running || true
running は、必要なすべてのユニットが正常であることを示します。トレーニング用 VM では、関係のない任意ユニットの失敗により degraded と表示されることがありますが、このコマンドによって systemd が応答していることは確認できます。
現在実行中のサービスの一部を一覧表示します。
systemctl list-units --type=service --state=running --no-pager | head -n 12
ユニットとは、systemd が管理するオブジェクトです。サービスユニットの末尾は .service です。ユニットファイルには、現在実行されていないものも含め、管理対象の定義が記述されています。
systemctl list-unit-files --type=service --no-pager | head -n 12
systemd の概要を簡潔に保存します。コマンド置換 $(...) によって、printf が書き込むテキスト内にコマンドの出力を埋め込めます。
printf 'systemd=%s\nstate=%s\n' "$(systemctl --version | head -n 1)" "$(systemctl is-system-running)" > systemd-summary.txt
cat systemd-summary.txt
サービス定義と状態を確認する
このステップでは、準備済みの練習用サービスを起動する前に、その定義を確認します。
systemctl status は、読み込まれたユニットのパス、有効化状態、実行時状態、プロセス情報、最近のログ行をまとめて表示します。
cd /home/labex/project/service-lab
systemctl status labex-heartbeat.service --no-pager
サービスは inactive (dead) かつ disabled になっているはずです。inactive は現在実行されていないことを意味し、disabled は起動時にインストール先ターゲット経由で起動するよう設定されていないことを意味します。これらは別々の属性です。
ユニット定義を表示します。
systemctl cat labex-heartbeat.service
[Unit] セクションには識別情報と起動順序、[Service] セクションにはプロセス、[Install] セクションには有効化方法が記述されています。ここでは準備済みのユニットを確認するだけで、ユニットを作成する必要はありません。
機械的に扱いやすいプロパティを systemctl show で表示します。
systemctl show labex-heartbeat.service -p LoadState -p ActiveState -p SubState -p UnitFileState
確認用にプロパティを保存します。
systemctl show labex-heartbeat.service -p LoadState -p ActiveState -p SubState -p UnitFileState > service-properties.txt
cat service-properties.txt
サービスを起動・停止・再起動する
このステップでは、練習用サービスの実行時状態を変更し、それぞれの結果を確認します。
システムサービスの起動と停止には昇格した権限が必要です。サービスを起動します。
sudo systemctl start labex-heartbeat.service
アクティブ状態を簡潔に確認します。
systemctl is-active labex-heartbeat.service
期待される出力は active です。詳細な状態を表示します。
systemctl status labex-heartbeat.service --no-pager
状態表示にメイン PID が含まれるようになります。サービスを停止し、結果を確認します。
sudo systemctl stop labex-heartbeat.service
systemctl is-active labex-heartbeat.service || true
期待される状態は inactive です。もう一度起動した後、restart を使って実行中のプロセスを一度の操作で置き換えます。
sudo systemctl start labex-heartbeat.service
sudo systemctl restart labex-heartbeat.service
systemctl show labex-heartbeat.service -p ActiveState -p SubState -p MainPID
このステップの終了時点で、サービスは ActiveState=active および SubState=running になっているはずです。
起動時の有効化を設定する
このステップでは、サービスの現在の実行状態と、次回以降の起動時に有効化されるかどうかの違いを確認します。
前のステップでサービスはアクティブになっていますが、セットアップ時にはユニットファイルが無効化された状態でした。有効化状態を確認します。
systemctl is-enabled labex-heartbeat.service || true
サービスを有効化します。
sudo systemctl enable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service
有効化すると、サービスを起動ターゲットに関連付けるリンクが作成されます。すでに実行中のサービスを再起動する必要はありません。
作成された起動用リンクを削除する操作も練習します。
sudo systemctl disable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service || true
出力が disabled になっても、サービスはアクティブなままにできます。実験の最終状態に戻すため、再度有効化します。
sudo systemctl enable labex-heartbeat.service
独立した 2 つの属性を確認します。
systemctl is-active labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service
journalctl でサービスログを検索する
このステップでは、systemd ジャーナルから最近のサービス出力を読み取り、対象を絞ったスナップショットを保存します。
systemd が管理するサービスは通常、標準出力と標準エラー出力をジャーナルに送ります。練習用ユニットだけを対象に検索します。
sudo journalctl -u labex-heartbeat.service -n 10 --no-pager
-u オプションはユニットを指定し、-n 10 は直近 10 件の記録に制限し、--no-pager はページャーを使わず直接表示します。サービスの起動メッセージとハートビート記録が表示されるはずです。
最近の一定期間に絞り込みます。
sudo journalctl -u labex-heartbeat.service --since "5 minutes ago" --no-pager
警告以上の優先度に絞り込みます。サービスが警告を記録していない場合、何も出力されないことは正常であり、問題ありません。
sudo journalctl -u labex-heartbeat.service -p warning --since "5 minutes ago" --no-pager
最近のユニット専用スナップショットをプロジェクトのワークスペースに保存します。
cd /home/labex/project/service-lab
sudo journalctl -u labex-heartbeat.service -n 20 --no-pager > service-journal.txt
tail -n 5 service-journal.txt
従来型のテキストログを追跡する
このステップでは、/var/log を確認し、新しい記録が追加されるテキストログをリアルタイムで追跡します。
/var/log 階層には、従来型のシステムログやアプリケーションログが多数保存されています。一部を一覧表示します。
ls -lh /var/log | head -n 12
練習用サービスの最新記録を読み取ります。
tail -n 5 /var/log/labex-heartbeat.log
-f オプションを使うと、ファイルを追跡し、別のプロセスによって追加された新しい行を表示できます。
tail -f /var/log/labex-heartbeat.log
新しいハートビート行が少なくとも 2 行表示されるまで待ち、その後 Ctrl+C を押します。これは tail を中断するだけで、ログを書き込んでいるサービスは停止しません。
ハートビート行だけを抽出し、最新の 3 行を表示します。
grep '^heartbeat ' /var/log/labex-heartbeat.log | tail -n 3
5 行分のサンプルをプロジェクトのワークスペースに保存します。
cd /home/labex/project/service-lab
tail -n 5 /var/log/labex-heartbeat.log > traditional-log-sample.txt
cat traditional-log-sample.txt
失敗したサービスを診断して復旧する
このステップでは、設定を意図的に壊し、サービス状態とログから原因を特定して、正常な状態へ復旧します。
練習用サービスを停止し、簡単な設定ファイルをバックアップします。
sudo systemctl stop labex-heartbeat.service
sudo cp /etc/labex-heartbeat.conf /etc/labex-heartbeat.conf.bak
数値の間隔を無効な値に置き換えます。これにより、練習用サービスだけが意図的に壊れます。
sudo sed -i 's/^INTERVAL=2$/INTERVAL=invalid/' /etc/labex-heartbeat.conf
サービスの起動を試みます。失敗メッセージが表示されるのが正しい動作です。
sudo systemctl start labex-heartbeat.service || true
失敗状態を確認します。
systemctl status labex-heartbeat.service --no-pager || true
systemctl is-failed labex-heartbeat.service
状態表示からプロセスが終了したことが分かりますが、アプリケーション固有の原因はジャーナルで確認できます。
sudo journalctl -u labex-heartbeat.service -n 10 --no-pager
configuration error: INTERVAL must be a positive integer というメッセージを探します。正常な設定を復元し、記録された失敗状態を解除して、サービスを再度起動します。
sudo mv /etc/labex-heartbeat.conf.bak /etc/labex-heartbeat.conf
sudo systemctl reset-failed labex-heartbeat.service
sudo systemctl start labex-heartbeat.service
復旧を確認します。
systemctl is-active labex-heartbeat.service
cat /etc/labex-heartbeat.conf
サービスは active になり、設定には再び INTERVAL=2 が含まれているはずです。
まとめ
プロセス、サービス、アクティブ状態、起動時の有効化の違いを確認しました。systemd ユニットを調べ、systemctl を使って安全な練習用サービスを制御し、journalctl でその記録を検索しました。
また、/var/log を確認し、tail -f でテキスト出力をリアルタイムに追跡しました。状態とログを組み合わせて意図的に発生させた障害の原因を説明し、サービスを復旧させました。この「まず状態を確認し、次にログを調べる」手順は、サービスのトラブルシューティングを始めるうえで実践的な基礎となります。



