🕗

Linuxのsystemd で指定した時刻にserviceをstartさせる方法とstopさせる方法

2023/04/23に公開

全てChatGPT4が教えてくれました。

systemd で指定した時刻にserviceをstartさせる方法を教えてください

systemd を使って指定した時刻にサービスを開始するには、systemd.timer ユニットを作成し、それを使用してサービスをトリガーします。以下の手順に従って、サービスを特定の時刻に起動させる設定を行ってください。

  1. サービス用の systemd サービスファイルを作成します。これは /etc/systemd/system/ に配置されるべきです。例えば、my_service.service という名前のサービスファイルがあるとします。
[Unit]
Description=My custom service

[Service]
ExecStart=/path/to/your/executable
  1. 同じディレクトリに、サービスに対応する 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 と指定します。

  1. システムが変更を認識するように、systemd に変更をリロードさせます。
sudo systemctl daemon-reload
  1. タイマーを有効にし、自動起動を設定します。
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されますか

指定した時刻になったときにすでにそのサービスが起動している場合、デフォルトの動作ではサービスは再起動されません。タイマーはサービスを開始するトリガーを提供するだけで、すでに実行中のサービスは影響を受けません。

ただし、タイマーによってトリガーされたサービスが再起動されるように設定することもできます。これには、サービスファイルで ExecStopExecStartPost セクションを追加し、サービスがすでに実行中の場合に再起動されるようにします。

例えば、以下のようにサービスファイルを変更できます(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 コマンドを実行することで実現できます。以下の手順に従って設定してください。

  1. /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 は停止したい対象のサービス名です。

  1. 同じディレクトリに、作成したサービスに対応する 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 と指定します。

  1. システムが変更を認識するように、systemd に変更をリロードさせます。
sudo systemctl daemon-reload
  1. タイマーを有効にし、自動起動を設定します。
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