systemctl でサービスを開始、停止、再起動する
このステップでは、systemctl コマンドを使用してシステムサービスのライフサイクルを管理する方法を学びます。サービスの開始、停止、再起動を練習します。この演習では、作成するダミーサービスを使用します。このアプローチにより、重要なシステム機能に影響を与えることなく、安全にサービスを操作できます。
まず、簡単なサービスユニットファイルを作成しましょう。このファイルは、数秒ごとにタイムスタンプをログファイルに書き込むサービスを定義します。
nano を使用して、systemd システムディレクトリに直接 mytest.service という名前の新しいサービスユニットファイルを作成します。
sudo nano /etc/systemd/system/mytest.service
nano エディタに以下の内容を貼り付けます。
[Unit]
Description=My Test Service
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service is running." >> /tmp/mytest.log; sleep 5; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure
[Install]
WantedBy=multi-user.target
[Unit]: ユニットに関する一般的な情報が含まれます。Description は人間が読める名前を提供し、After=network.target はこのサービスがネットワーク起動後に開始されることを指定します。
[Service]: サービスの動作を定義します。
Type=simple: ExecStart コマンドがメインプロセスであるシンプルなサービスタイプを示します。
ExecStart: サービスが開始されたときに実行されるコマンドです。ここでは、5 秒ごとにタイムスタンプ付きのメッセージを /tmp/mytest.log に書き込む bash ループです。
ExecStop: サービスが停止されたときに実行されるコマンドです。停止メッセージをログに書き込みます。
Restart=on-failure: サービスがゼロ以外のステータスで終了した場合に再起動するように構成します。
[Install]: サービスがどのようにインストールされるべきかの情報が含まれます。WantedBy=multi-user.target は、システムがマルチユーザーランレベルに到達したときにこのサービスが開始されるべきであることを意味します。
Ctrl+X を押し、次に Y を押して確認し、Enter を押してファイルを保存してファイルを保存します。
次に、systemd デーモンをリロードして新しいサービスファイルを認識させます。
sudo systemctl daemon-reload
サービスの開始
サービスを開始するには、systemctl start コマンドを使用します。
mytest.service を開始するには、次のコマンドを実行します。systemctl 操作は通常 root 権限を必要とするため、sudo を使用する必要があることに注意してください。
sudo systemctl start mytest.service
コマンドが成功した場合、即座に出力はありません。
次に、ステータスを確認してサービスが実行されていることを確認します。
systemctl status mytest.service
サービスが active (running) であることを示す出力が表示されるはずです。
● mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: active (running) since ...
Main PID: ... (bash)
Tasks: 2 (limit: ...)
Memory: ...
CPU: ...
CGroup: /system.slice/mytest.service
├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
└─... sleep 5
...output omitted...
サービスがメッセージを書き込んでいるかを確認するためにログファイルを確認することもできます。
tail -f /tmp/mytest.log
以下のような新しい行が 5 秒ごとに表示されるはずです。
Tue Jul 22 09:15:09 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:14 AM CST 2025: My Test Service is running.
Ctrl+C を押して tail を終了します。
サービスの停止
実行中のサービスを停止するには、systemctl stop コマンドを使用します。
mytest.service を停止するには、次のコマンドを実行します。
sudo systemctl stop mytest.service
ここでも、即座に出力はありません。
サービスが停止したことを確認します。
systemctl status mytest.service
出力は Active: inactive (dead) と表示されるはずです。
○ mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: inactive (dead) since ...
...output omitted...
ログファイル /tmp/mytest.log を再度確認します。「My Test Service stopped.」というメッセージが表示され、新しい「running」メッセージが表示されなくなっているはずです。
tail /tmp/mytest.log
出力は以下のようになります。
Tue Jul 22 09:15:24 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
サービスの再起動
サービスを再起動するには、systemctl restart コマンドを使用します。このコマンドは、まずサービスを停止してから、再度開始します。これは、サービスの構成を変更し、その変更を有効にする必要がある場合に便利です。
mytest.service を再起動するには、次のコマンドを実行します。
sudo systemctl restart mytest.service
サービスが再び実行されていることを確認します。
systemctl status mytest.service
Active: active (running) が再び表示され、Main PID は新しい番号になる可能性が高く、新しいプロセスが開始されたことを示しています。
● mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: active (running) since ...
Main PID: ... (bash)
Tasks: 2 (limit: ...)
Memory: ...
CPU: ...
CGroup: /system.slice/mytest.service
├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
└─... sleep 5
...output omitted...
ログファイル /tmp/mytest.log を確認して、サービスが「running」メッセージの書き込みを再開したことを確認します。
tail -f /tmp/mytest.log
「stopped」メッセージの後に新しい「running」メッセージが表示されるはずです。
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
Tue Jul 22 09:15:40 AM CST 2025: My Test Service is running.
Ctrl+C を押して tail を終了します。