Linuxのsystemd で指定した時刻にserviceをstartさせる方法とstopさせる方法
全てChatGPT4が教えてくれました。
systemd で指定した時刻にserviceをstartさせる方法を教えてください
systemd を使って指定した時刻にサービスを開始するには、systemd.timer
ユニットを作成し、それを使用してサービスをトリガーします。以下の手順に従って、サービスを特定の時刻に起動させる設定を行ってください。
- サービス用の systemd サービスファイルを作成します。これは
/etc/systemd/system/
に配置されるべきです。例えば、my_service.service
という名前のサービスファイルがあるとします。
[Unit]
Description=My custom service
[Service]
ExecStart=/path/to/your/executable
- 同じディレクトリに、サービスに対応する
systemd.timer
ファイルを作成します。例えば、my_service.timer
という名前で作成します。
[Unit]
Description=Run my_service at specified time
[Timer]
OnCalendar=<指定時刻>
Persistent=true
[Install]
WantedBy=timers.target
<指定時刻>
は、systemd.time
形式で指定する必要があります。例えば、毎日午前 8 時にサービスを実行したい場合、OnCalendar=*-*-* 08:00:00
と指定します。
- システムが変更を認識するように、systemd に変更をリロードさせます。
sudo systemctl daemon-reload
- タイマーを有効にし、自動起動を設定します。
sudo systemctl enable --now my_service.timer
これで、指定された時刻に my_service.service
が自動的に開始されるようになります。タイマーの状態を確認するには、以下のコマンドを使用してください。
sudo systemctl status my_service.timer
タイマーを無効にしたい場合は、以下のコマンドを実行します。
sudo systemctl disable --now my_service.timer
指定した時刻になったときにすでにそのserviceがstart していた場合はどうなりますか。そのままなにもなく続行されるのか、それともrestartされますか
指定した時刻になったときにすでにそのサービスが起動している場合、デフォルトの動作ではサービスは再起動されません。タイマーはサービスを開始するトリガーを提供するだけで、すでに実行中のサービスは影響を受けません。
ただし、タイマーによってトリガーされたサービスが再起動されるように設定することもできます。これには、サービスファイルで ExecStop
と ExecStartPost
セクションを追加し、サービスがすでに実行中の場合に再起動されるようにします。
例えば、以下のようにサービスファイルを変更できます(my_service.service
):
[Unit]
Description=My custom service
[Service]
Type=oneshot
ExecStop=/bin/kill -HUP $MAINPID
ExecStart=/path/to/your/executable
ExecStartPost=/bin/sleep 1
RemainAfterExit=yes
この設定では、サービスがタイマーによってトリガーされたとき、ExecStop
セクションに記述されたコマンドが実行され、すでに実行中のサービスが終了します。その後、ExecStart
セクションのコマンドが実行され、サービスが再起動されます。ExecStartPost
セクションのコマンドは、サービスが再起動した後に実行されます。
ただし、この方法はサービスの設定によっては適切でない場合があります。サービスの状態を正しく保持するため、アプリケーションに再起動オプションが用意されている場合は、それを使用することを検討してください。
指定した時刻にservice をstop するにはどうしたらできますか
指定した時刻にサービスを停止するには、systemd タイマーを使用して別のサービスファイルを作成し、そのサービスファイルで systemctl stop
コマンドを実行することで実現できます。以下の手順に従って設定してください。
-
/etc/systemd/system/
ディレクトリに、指定した時刻にサービスを停止するためのサービスファイルを作成します。例えば、stop_my_service.service
という名前で作成します。
[Unit]
Description=Stop my custom service at specified time
[Service]
Type=oneshot
ExecStart=/bin/systemctl stop my_service.service
ここで、my_service.service
は停止したい対象のサービス名です。
- 同じディレクトリに、作成したサービスに対応する
systemd.timer
ファイルを作成します。例えば、stop_my_service.timer
という名前で作成します。
[Unit]
Description=Stop my_service at specified time
[Timer]
OnCalendar=<指定時刻>
Persistent=true
[Install]
WantedBy=timers.target
<指定時刻>
は、systemd.time
形式で指定する必要があります。例えば、毎日午前 10 時にサービスを停止したい場合、OnCalendar=*-*-* 10:00:00
と指定します。
- システムが変更を認識するように、systemd に変更をリロードさせます。
sudo systemctl daemon-reload
- タイマーを有効にし、自動起動を設定します。
sudo systemctl enable --now stop_my_service.timer
これで、指定された時刻に my_service.service
が自動的に停止されるようになります。タイマーの状態を確認するには、以下のコマンドを使用してください。
sudo systemctl status stop_my_service.timer
タイマーを無効にしたい場合は、以下のコマンドを実行します。
sudo systemctl disable --now stop_my_service.timer
よくわかりました。どうもありがとう
どういたしまして!質問がお役に立ててうれしいです。これからも何か質問や困ったことがあれば、お気軽にお問い合わせください。お手伝いできることがあれば喜んで対応いたします。
Discussion