トラブルシューティングとベスト プラクティス
この最後の手順では、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
エラーがなければ、このコマンドは何も出力しません。構文エラーが報告されます。
-
サービス テンプレートを使用する:複数のインスタンスが必要なサービスの場合、重複を避けるためにサービス テンプレート ( [email protected]
と名前付けられたファイル) を使用します。
-
サービスの依存関係を確認する:サービスが正しい順序で起動するように、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
コマンドの重要性を理解しました。