40分ごとに実行する必要があるnodejs GUIプログラム(ユーザー対話は必要ありません)があります。午後5時40分、午後6時40分、午後7時40分などで実行されるとします。 Debian サーバーで次のコマンドを使用して systemd タイマーを有効にしました。
systemctl --user enable my_program.timer
問題は、スケジュールが所定の時間に開始され、正常に完了することです。ただし、プログラムはすぐに再起動され、正常に完了します。
ショーが午後5時40分に始まり、午後5時45分に終わるとしましょう。約1分後、たとえば午後5時46分にプログラムが再起動して終了します。その後、次回の午後6時40分にこのようなことが再び発生します。
これは時間ごとに発生します。また、そのユーザーアカウントでログインしてサーバーを再起動すると、5分待たずにすぐにプログラムが起動します。
- 2番目の自動実行を停止する方法は?
- 5分後に強制的に再起動するには?
コンテンツ/home/user/schedule.sh
#! /usr/bin/bash
cd /home/user/my_program && DISPLAY=:0 /usr/bin/node ./index.js
コンテンツ/home/user/.config/systemd/user/my_program.service
[Unit]
Description=My Program
[Service]
ExecStart=/home/user/schedule.sh
コンテンツ/home/user/.config/systemd/user/my_program.timer
[Unit]
Description=My Program Timer
Requires=my_program.service
[Timer]
Unit=my_program.service
OnCalendar=*-*-* *:40:*
OnBootSec=5 minutes
[Install]
WantedBy=timers.target
答え1
ここでは、1つの問題、つまり毎時間実行される繰り返し実行に集中します。次の構文を使用しました。
OnCalendar=*-*-* *:40:*
秒のワイルドカード表現は、man systemd.time
毎時間40分の毎秒と一致します。カレンダーサブコマンドを含むツールを使用してsystemd-analyze
それらを確認できます。
systemd-analyze calendar --iterations=5 "*-*-* *:40:*"
Normalized form: *-*-* *:40:*
Next elapse: Thu 2020-12-17 17:40:00 EST
(in UTC): Thu 2020-12-17 22:40:00 UTC
From now: 15min left
Iter. #2: Thu 2020-12-17 17:40:01 EST
(in UTC): Thu 2020-12-17 22:40:01 UTC
From now: 15min left
Iter. #3: Thu 2020-12-17 17:40:02 EST
(in UTC): Thu 2020-12-17 22:40:02 UTC
From now: 15min left
Iter. #4: Thu 2020-12-17 17:40:03 EST
(in UTC): Thu 2020-12-17 22:40:03 UTC
From now: 15min left
Iter. #5: Thu 2020-12-17 17:40:04 EST
(in UTC): Thu 2020-12-17 22:40:04 UTC
From now: 15min left
だからこれは問題です。
Requires=
2番目の問題は、タイマーに含めたことです。man systed.unit
このディレクティブのドキュメントには、次Requires=
のように記載されています。
このユニットがアクティブになると、[In Requires =]にリストされているユニットもアクティブになります。
その結果、ターゲットサービスが2番目にロードされる可能性があります。
時間に関する新しい質問を提起するOnBootSec=
のは別の質問です。