サービスタイマーファイルがsystemdでは機能しません。

サービスタイマーファイルがsystemdでは機能しません。

私はRedHatチュートリアルに従い、systemdを使用してイベントを実行する方法を学びたいと思います。次のサービスを作成しました。

[Unit]
Description=Script2 Logged-In Users

[Service]
Type=simple
ExecStart=/root/Documents/Scripts/script2

[Install]
WantedBy=muti-user.target

次のスクリプトを参照してください。

#!/bin/bash

echo "Users logged in as of $(date)" >> ~/Documents/UserFiles/useractivity.txt
who >> ~/Documents/UserFiles/useractivity.txt

スクリプトをスタンドアロンで実行すると正常に実行されますが、タイマーで実行しようとすると起動後にのみ実行されます。タイマーファイルです

[Unit]
Description=Execute Script2 every 10 seconds

[Timer]
#OnBootSec=10min (run script 10 mins after boot)
#OnCalendar=Mon 2015-*-1 10:00:00 (run script at 10am on 1st day of every month if it's a Monday)
#OnCalendar=*:0/15 (run script every 15 minutes)
OnUnitActiveSec=10s (run script every 10 seconds)
unit=script2.service

サービスの状態を確認したときに表示されるエラーです。

script2.service - Script2 Logged-In Users
   Loaded: loaded (/etc/systemd/system/script2.service; enabled; vendor preset: disabled)
   Active: inactive (dead)

Aug 08 15:17:38 localhost.localdomain script2[7918]: /root/Documents/Scripts/script2: line 3: Documents/UserFiles/useractivity.txt: No such file or directory
Aug 08 15:17:38 localhost.localdomain script2[7918]: /root/Documents/Scripts/script2: line 4: Documents/UserFiles/useractivity.txt: No such file or directory
Aug 08 15:17:38 localhost.localdomain systemd[1]: script2.service: main process exited, code=exited, status=1/FAILURE
Aug 08 15:17:38 localhost.localdomain systemd[1]: Unit script2.service entered failed state.
Aug 08 15:17:38 localhost.localdomain systemd[1]: script2.service failed.
Aug 08 15:24:44 localhost.localdomain systemd[1]: Started Script2 Logged-In Users.
Aug 08 15:25:44 localhost.localdomain systemd[1]: Started Script2 Logged-In Users.
Aug 08 15:28:19 localhost.localdomain systemd[1]: Started Script2 Logged-In Users.
Aug 08 15:29:34 localhost.localdomain systemd[1]: Started Script2 Logged-In Users.
Aug 08 15:45:58 localhost.localdomain systemd[1]: Started Script2 Logged-In Users.

これがタイマーをリストしたときに得られる結果です。

NEXT                         LEFT     LAST                         PASSED       
Tue 2022-08-09 00:00:00 EDT  8h left  Mon 2022-08-08 11:17:23 EDT  4h 40min ago 
Tue 2022-08-09 12:16:53 EDT  20h left Mon 2022-08-08 12:16:53 EDT  3h 40min ago 
n/a                          n/a      n/a                          n/a          

注:最初の2つは異なるプロセスからのものです。

なぜタイマーが機能しないのか分かりません。

答え1

を使用すると、OnUnitActiveSecs次のことを意味します。

アクティブなタイマーデバイスに関して、デバイスが最後にアクティブになった時間に基づいてタイマーを定義します。

タイマーがあるからデバイスが最後にアクティブになった時間に基づいています。、タイマーが作成されてからデバイスが起動していない場合、タイマーは決して実行されません。

exampleservice.service次のコンテンツで作成すると、簡単な例でこれを達成できます。

[Service]
Type = simple
ExecStart = /bin/sh -c 'date >> /tmp/datelog.txt'

exampleservice.timer以下を含みます。

[Timer]
OnUnitActiveSec=10s

タイマーを起動します。

systemctl start exampleservice.timer

タイマーに「次」または「最後」の実行時間がないことがわかります。

$ systemctl list-timers | grep example
n/a                         n/a           n/a                         n/a          exampleservice.timer                exampleservice.service

しかし、サービスを一度起動すると、次のようになります。

systemctl start exampleservice

タイマーにすぐに「次の」実行時間があることがわかります。

$ systemctl list-timers | grep example
Mon 2022-08-08 18:17:15 EDT 9s left       n/a                         n/a         exampleservice.timer                exampleservice.service

10秒間待つと、定期的に実行されていることがわかります。

$ systemctl list-timers | grep example
Mon 2022-08-08 18:17:43 EDT 682ms left    Mon 2022-08-08 18:17:33 EDT 9s ago       exampleservice.timer                exampleservice.service

サービスを最初に開始せずに定期的に実行するには、マニュアルを確認してくださいsystemd.timer

複数の命令は、同じタイプとは異なるタイプで構成できます。この場合、タイマー装置は、指定されたタイマー式が経過するたびに実行されます。たとえば、OnBootSec =とOnUnitActiveSec =を組み合わせると、定期的に実行され、毎回特定のサービスを有効にするタイマーを定義できます。

そのため、通常は次のように見て使用します。これは、「システム起動後にN秒を開始し、その後M秒ごとに実行」を意味しますOnBootSecOnUnitActiveSec

または、OnCalendarアイテムを使用して同じ目的を達成できます。

[Timer]
OnCalendar = *-*-* *:*:00/10

これは10秒ごとに実行されます。

関連情報