はじめに
このチュートリアルでは、Linux システム上で systemctl daemon-reload コマンドを使用してシステムデーモンとサービスを管理するプロセスを案内します。Systemd はほとんどの最新の Linux ディストリビューションのデフォルトのサービスマネージャであり、サービス構成を適切に更新する方法を理解することは、Linux ユーザーや管理者にとって不可欠なスキルです。
この実験では、systemctl daemon-reload コマンドをいつ、なぜ使用するのかを学び、サービスファイルを作成および変更し、システムの操作を中断することなく構成変更を適用します。このチュートリアルの終わりまでに、systemd サービスを扱い、構成変更を効果的に適用できるようになります。
この実験では学習にインターネット接続が必要です。したがって、Pro ユーザーのみが仮想マシン (VM) を起動できます。アカウントを Pro にアップグレードする。
systemd と systemctl の基本を理解する
Systemd は、この実験で使用している Ubuntu 22.04 を含む、ほとんどの最新の Linux ディストリビューションのサービスおよびシステムマネージャです。システムサービスの起動と管理を担当しており、systemctl は systemd と対話するために使用される主要なコマンドラインツールです。
システムデーモンとは何か?
デーモンは、Linux システム上で継続的に実行されるバックグラウンドプロセスです。これらのプロセスは、ウェブページの提供 (Apache、Nginx)、データベースの管理 (MySQL、PostgreSQL)、またはシステムイベントの処理など、さまざまなタスクを実行します。Systemd は、「ユニットファイル」と呼ばれる標準化された構成ファイルを通じてこれらのデーモンを管理します。
基本的な systemctl コマンド
システムの現在の状態を理解するために、いくつかの基本的な systemctl コマンドを調べてみましょう。
ターミナル アイコンをクリックしてターミナルを開きます。
次のコマンドを使用して、すべてのアクティブなシステムサービスを一覧表示します。
systemctl list-units --type=service

このコマンドは、システム上の現在アクティブなすべてのサービスを表示します。以下のような出力が表示されるはずです。
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
apparmor.service loaded active exited AppArmor initialization
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
...
コマンドを終了するには、Ctrl+C または Q を押します。
- 特定のサービス、たとえば SSH サービスの状態を確認します。
systemctl status ssh

SSH サービスに関する詳細情報、アクティブかどうか、プロセス ID、最近のログエントリなどが表示されるはずです。
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-06-13 12:34:56 UTC; 3h 25min ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 1234 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 1235 (sshd)
Tasks: 1 (limit: 4915)
Memory: 5.6M
CPU: 236ms
CGroup: /system.slice/ssh.service
└─1235 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
- systemd サービスファイルが格納されている場所を調べましょう。これらは、次の手順で扱うファイルです。
ls -l /etc/systemd/system/
このディレクトリには、systemd がサービスを管理する方法を定義するサービス ユニットファイルが含まれています。いくつかの .service ファイルとシンボリック リンクが表示されるはずです。
- システムが提供するユニットファイルは別のディレクトリにあります。調べてみましょう。
ls -l /lib/systemd/system/
このディレクトリには、システムに付属する既定のサービス ユニットファイルが含まれています。
これで、systemd の基本とサービスの状態を確認する方法を理解しましたので、次の手順でサービスファイルを作成および変更できるようになりました。
シンプルな systemd サービスファイルの作成
この手順では、カスタム スクリプトを実行するシンプルな systemd サービスファイルを作成します。これにより、サービスファイルの仕組みとその変更方法を理解する手助けになります。
シンプルなスクリプトを作成する
まず、サービスが実行するシンプルなスクリプトを作成しましょう。
- スクリプト用のディレクトリを作成します。
mkdir -p ~/project/scripts
nanoテキスト エディタを使用してシンプルなスクリプトを作成します。
nano ~/project/scripts/hello-service.sh
- スクリプトに次の内容を追加します。
#!/bin/bash
while true; do
echo "Hello from custom service: $(date)" >> /tmp/hello-service.log
sleep 10
done
エディタを終了するには Ctrl+X を押し、次にファイルを保存するには Y を押し、そしてファイル名を確認するには Enter を押します。
このスクリプトは、10 秒ごとに現在の日付付きのメッセージをログ ファイルに書き込みます。
- スクリプトを実行可能にします。
chmod +x ~/project/scripts/hello-service.sh
systemd サービス ユニットファイルを作成する
次に、このスクリプトを実行する systemd サービスファイルを作成しましょう。
sudo権限を使用して新しいサービスファイルを作成します。
sudo nano /etc/systemd/system/hello-service.service
- サービスファイルに次の内容を追加します。
[Unit]
Description=Hello Service Demo
After=network.target
[Service]
Type=simple
ExecStart=/home/labex/project/scripts/hello-service.sh
Restart=on-failure
User=labex
[Install]
WantedBy=multi-user.target
このファイルの各セクションを理解しましょう。
[Unit]: メタデータと依存関係を含む
Description: サービスの分かりやすい説明After: このサービスはネットワークが準備完了した後に起動することを指定する
[Service]: サービスの実行方法を定義する
Type=simple: サービスはすぐに起動するExecStart: 実行するコマンド (私たちのスクリプト)Restart: サービスが失敗した場合に自動的に再起動するUser: サービスを実行するユーザ アカウント
[Install]: サービスが有効になるタイミングと方法を定義する
WantedBy: サービスが起動するタイミングを指定する (multi-user.target は通常のシステム操作を意味する)
ファイルを保存してエディタを終了します (
nanoでCtrl+X、次にY、そしてEnterを押します)。新しく作成したサービスファイルを調べましょう。
cat /etc/systemd/system/hello-service.service
先ほど追加したファイルの内容が表示されるはずです。

次の手順では、systemctl daemon-reload コマンドを使用してこのサービスを読み込み、起動する方法を学びます。
systemctl daemon-reload を使用して変更を適用する
これで systemd サービスファイルを作成したので、systemd にこの新しいサービスについて知らせる必要があります。ここで systemctl daemon-reload コマンドが役に立ちます。
systemctl daemon-reload とは?
systemctl daemon-reload コマンドは、systemd にすべてのサービスファイルを再読み込みさせ、内部構成を更新するよう指示します。以下の場合にはこれが必要です。
- 新しいサービスファイルを作成する
- 既存のサービスファイルを変更する
- サービスファイルを削除する
このコマンドを実行しないと、systemd は変更を認識しません。
systemd 構成を再読み込みする
- 以下のコマンドを実行して、systemd 構成を再読み込みします。
sudo systemctl daemon-reload
このコマンドは成功時に何も出力しませんが、systemd の内部構成を更新します。
- 次に、systemd が新しいサービスを認識しているかどうかを確認しましょう。
systemctl status hello-service
サービスが読み込まれているが非アクティブな状態が表示されるはずです。
● hello-service.service - Hello Service Demo
Loaded: loaded (/etc/systemd/system/hello-service.service; disabled; vendor preset: enabled)
Active: inactive (dead)
サービスを起動する
- サービスを起動しましょう。
sudo systemctl start hello-service
- 再度状態を確認して、実行中かどうかを確認しましょう。
systemctl status hello-service

この時点で、サービスがアクティブで実行中であることが表示されるはずです。
● hello-service.service - Hello Service Demo
Loaded: loaded (/etc/systemd/system/hello-service.service; disabled; vendor preset: enabled)
Active: active (running) since [timestamp]; [time] ago
Main PID: [pid number] (hello-service.sh)
Tasks: 2 (limit: 4915)
Memory: 592.0K
CPU: 5ms
CGroup: /system.slice/hello-service.service
└─[pid number] /bin/bash /home/labex/project/scripts/hello-service.sh
- 作成したログファイルを確認することで、サービスが実際に機能していることを確認しましょう。
cat /tmp/hello-service.log
以下のような複数行の出力が表示されるはずです。
Hello from custom service: Wed Jun 14 15:30:45 UTC 2023
Hello from custom service: Wed Jun 14 15:30:55 UTC 2023
Hello from custom service: Wed Jun 14 15:31:05 UTC 2023
ログエントリには現在の日付と時刻が表示され、サービスが実行されており、予想通りにスクリプトが実行されていることが確認できます。
- サービスを起動時に自動的に起動するように有効にします。
sudo systemctl enable hello-service
以下のような出力が表示されるはずです。
Created symlink /etc/systemd/system/multi-user.target.wants/hello-service.service → /etc/systemd/system/hello-service.service.
これは、サービスが現在有効になっており、システム起動時に自動的に起動することを意味します。
これで、サービスを成功裏に作成し、systemctl daemon-reload を使用して systemd に知らせ、サービスを起動しました。次の手順では、サービスを変更して変更を適用します。
サービス構成の変更
この手順では、サービス構成を変更し、systemctl daemon-reload を使用して変更を適用します。これは、サービス構成を更新する際のこのコマンドの重要性を示すものです。
サービスファイルを変更する
メッセージをログに記録する頻度を変更するために、サービスを変更しましょう。
- サービスファイルを編集します。
sudo nano /etc/systemd/system/hello-service.service
[Service]セクションに新しい環境変数を追加して、スリープ間隔を制御します。User=labexの行の後にこの行を追加します。
Environment="SLEEP_INTERVAL=5"
ファイルを保存して終了します (
nanoでCtrl+X、次にY、そしてEnterを押します)。次に、この環境変数を使用するようにスクリプトを編集します。
nano ~/project/scripts/hello-service.sh
- スクリプトを変更して環境変数を使用するようにします (以下の内容で置き換えます)。
#!/bin/bash
## Default to 10 seconds if environment variable is not set
INTERVAL=${SLEEP_INTERVAL:-10}
while true; do
echo "Hello from custom service: $(date) - Interval: ${INTERVAL}s" >> /tmp/hello-service.log
sleep $INTERVAL
done
- エディタを保存して終了します (
nanoでCtrl+X、次にY、そしてEnterを押します)。
変更を適用する
サービスファイルとスクリプトの両方に変更を加えたので、これらの変更を適用する必要があります。
- まず、systemd 構成を再読み込みします。
sudo systemctl daemon-reload
- 次に、変更を適用するためにサービスを再起動します。
sudo systemctl restart hello-service
- サービスの状態を確認します。
systemctl status hello-service
更新された構成でサービスが実行されていることが表示されるはずです。
- ログファイルを確認することで、変更が有効になったことを確認します。
sleep 15 ## Wait to collect a few log entries
cat /tmp/hello-service.log | tail -5
この時点で、サービスが 10 秒ではなく 5 秒ごとにメッセージをログに記録しており、ログエントリには新しい間隔情報が含まれているはずです。
Hello from custom service: Wed Jun 14 15:45:10 UTC 2023 - Interval: 5s
Hello from custom service: Wed Jun 14 15:45:15 UTC 2023 - Interval: 5s
Hello from custom service: Wed Jun 14 15:45:20 UTC 2023 - Interval: 5s

何が起こったか理解する
さて、何が起こったか理解しましょう。
- サービスファイルを変更して環境変数を追加しました。
- この環境変数を使用するようにスクリプトを更新しました。
systemctl daemon-reloadを実行して、サービスファイルの変更を systemd に知らせました。- これらの変更を適用するためにサービスを再起動しました。
systemctl daemon-reload コマンドがなければ、systemd はサービスファイルの変更を認識せず、サービスを再起動する際に環境変数がスクリプトに渡されなかったでしょう。
これは、サービスファイルを変更する際に systemctl daemon-reload が不可欠な理由を示しています。サービスを起動または再起動して変更を適用する前に、systemd に変更を認識させるためです。
トラブルシューティングとベスト プラクティス
この最後の手順では、systemd サービスを扱う際に発生する可能性のある一般的な問題とそのトラブルシューティング方法について学びます。また、systemctl daemon-reload を使用する際のいくつかのベスト プラクティスについても学びます。
一般的な問題のトラブルシューティング
1. サービスの起動に失敗する
サービスの起動に失敗した場合、最初のステップはその状態を確認することです。
systemctl status hello-service
これにより、詳細なエラー情報が多くの場合提供されます。意図的にエラーを作成して、そのトラブルシューティング方法を見てみましょう。
- サービスファイルを編集します。
sudo nano /etc/systemd/system/hello-service.service
ExecStart行を変更して、存在しないスクリプトを指すようにします。
ExecStart=/home/labex/project/scripts/non-existent.sh
ファイルを保存してエディタを終了します。
systemd 構成を再読み込みして、サービスを再起動しようとします。
sudo systemctl daemon-reload
sudo systemctl restart hello-service
- 状態を確認してエラーを見ます。
systemctl status hello-service
スクリプトが存在しないことを示すエラー メッセージが表示されるはずです。
● hello-service.service - Hello Service Demo
Loaded: loaded (/etc/systemd/system/hello-service.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since [timestamp]; [time] ago
Process: [pid] ExecStart=/home/labex/project/scripts/non-existent.sh (code=exited, status=203/EXEC)
Main PID: [pid] (code=exited, status=203/EXEC)
CPU: 5ms
[timestamp] systemd[1]: Started Hello Service Demo.
[timestamp] systemd[pid]: hello-service.service: Failed to execute command: No such file or directory
[timestamp] systemd[pid]: hello-service.service: Failed at step EXEC spawning /home/labex/project/scripts/non-existent.sh: No such file or directory
[timestamp] systemd[1]: hello-service.service: Main process exited, code=exited, status=203/EXEC
[timestamp] systemd[1]: hello-service.service: Failed with result 'exit-code'.
- サービスファイルを修正して、正しいスクリプトを指すように戻します。
sudo nano /etc/systemd/system/hello-service.service
ExecStart行を戻して:
ExecStart=/home/labex/project/scripts/hello-service.sh
- 保存して終了し、その後再読み込みして再起動します。
sudo systemctl daemon-reload
sudo systemctl restart hello-service
- サービスが再び実行されていることを確認します。
systemctl status hello-service
2. 詳細なログを取得するための journal ログの読み取り
トラブルシューティング中に、journalctl を使用して詳細なログを表示できます。
sudo journalctl -u hello-service
これは、hello-service ユニットのすべてのログを表示し、問題の診断に非常に役立ちます。
最新のログのみを表示するには:
sudo journalctl -u hello-service -n 20
ログをリアルタイムで追跡するには ( tail -f と同様):
sudo journalctl -u hello-service -f
ログ追跡モードを終了するには Ctrl+C を押します。
systemctl daemon-reload を使用する際のベスト プラクティス
systemd と daemon-reload コマンドを使用する際に従うべきいくつかのベスト プラクティスを以下に示します。
変更後は必ず再読み込みする:systemd ユニットファイルを変更、追加、または削除した後は、常に
systemctl daemon-reloadを実行します。適用前に構文を確認する:再読み込み前に、サービスファイルの構文エラーを確認するために以下のコマンドを使用できます。
sudo systemd-analyze verify /etc/systemd/system/hello-service.service
エラーがなければ、このコマンドは何も出力しません。構文エラーが報告されます。
サービス テンプレートを使用する:複数のインスタンスが必要なサービスの場合、重複を避けるためにサービス テンプレート (
service@.serviceと名前付けられたファイル) を使用します。サービスの依存関係を確認する:サービスが正しい順序で起動するように、
After=とRequires=ディレクティブが正しいことを確認します。適切にクリーンアップする:サービスを削除する際は、サービスファイルを削除する前に、まず停止して無効にします。
sudo systemctl stop hello-service
sudo systemctl disable hello-service
sudo rm /etc/systemd/system/hello-service.service
sudo systemctl daemon-reload
ここで、例のサービスをクリーンアップしましょう。
sudo systemctl stop hello-service
sudo systemctl disable hello-service
シンボリック リンクが削除されたことを示す出力が表示されるはずです。
Removed /etc/systemd/system/multi-user.target.wants/hello-service.service.
検証にまだ必要なので、まだサービスファイルを削除しません。
これで、systemd サービスを作成、変更、トラブルシューティングする方法と、これらのサービスを管理する際の systemctl daemon-reload コマンドの重要性を理解しました。
まとめ
この実験では、Linux システム上のシステム デーモンとサービスを管理するために systemctl daemon-reload コマンドをどのように使用するかを学びました。以下のことができました。
- systemd と systemctl の基本を理解する
- カスタム systemd サービスファイルを作成する
- systemctl daemon-reload を使用してサービス構成に変更を適用する
- サービスファイルを変更してそれらの変更を適用する
- 一般的な問題のトラブルシューティング方法とベスト プラクティスを学ぶ
systemctl daemon-reload コマンドは、systemd サービスを扱う際に不可欠です。なぜなら、このコマンドにより、systemd マネージャがサービス構成に対して行った変更を認識するようになるからです。このコマンドがなければ、サービスファイルの変更は次の再起動までシステムによって認識されません。
この知識は、Linux システムを引き続き扱う際に役立ち、サービスを効果的に管理し、構成変更が適切に適用されることを確認することができます。



