一般化する

一般化する

一般化する

無効な(「静的」)システムサービス単位で、再起動するたびにタイマーによってトリガーされて実行される必要があります。

背景

/etc/systemd/system/前に[Install]部署があってdだったサービス単位( )ですsystemctl enable

この[Install]セクションは削除され、サービスは無効になっています。サービスはタイマーによってトリガーされます。タイマーは月に一度実行するように設定されており、永続的なため、最後の実行を追跡し、終了時に実行を見逃した場合を除き、再起動時には実行されません。

systemctl --system daemon-reload変更後は走りました。

タイマーが正常に動作し、期待どおりにサービスをトリガーします。

質問

再起動すると、タイマーが最後に実行された時間とタイマーが持続するかどうかに関係なく、サービスユニットは常に実行されます。 (最後のトリガ時間の出力が間違っているsystemctl list-timers場合を除き)、サービスユニットをトリガすることがタイマーユニットではないことを確認(通過)しました。list-timers

systemctl is-enabled <service-unit>表示済みstatic(無効化、[Install]セルにセクションなし)

find /etc/systemd/system/*.wants -name <service-unit>このサービスの以前のインストール/アクティブ化から残ったインストール済みシンボリックリンクを表示しないでください。

再起動時にサービスが開始されるようにするこのサービスデバイスの以前のインストールには、いくつかの「レガシー」エントリがあるようですが、どこを見るべきかわかりません。

これはUbuntu 20.04にあります(既知のバグ/問題がある場合)。

systemdがユニットを起動する理由をデバッグする方法はありますか? (たとえば、デバイスXはファイルZのYが必要なため起動します。)

サービスが実際にタイマーによって開始されていない(outputによって開始されるのではなくlist-timers)、再確認する方法はありますか?

サービスユニット

# cat /etc/systemd/system/mysql_tzinfo.service
[Unit]
Description=mysql_tzinfo
Wants=mysql_tzinfo.timer

[Service]
Type=oneshot
Environment=
WorkingDirectory=/tmp
ExecStart=/bin/sh -c "/usr/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | /usr/bin/mysql --user=root mysql"

User=root
Group=root

タイマーユニット

# cat /etc/systemd/system/mysql_tzinfo.timer
[Unit]
Description=Timer for mysql_tzinfo.service
Requires=mysql_tzinfo.service

[Timer]
Unit=mysql_tzinfo.service
OnCalendar=*-*-05 04:00:00
AccuracySec=30s
Persistent=true

[Install]
WantedBy=timers.target

答え1

Requires=mysql_tzinfo.serviceさて、この記事を書いている間、タイマーデバイスセクションに1つが​​あることがわかりました。[Unit]

起動時にタイマーの起動(systemdによる依存関係の解決)によってサービスが開始される可能性があると思いましたRequires。もちろん、タイマーからこの行を削除して再起動すると、サービスは開始されなくなります。これは私が「技術ブログ」をフォローし、すべての設定オプションを再確認しないときに得られるものです。

cronからsystemdタイマーに移行したい人のための重要な要約:

  • [Install]サービスユニットにセクションを追加しないでください。サービスユニットsystemctl enableにサービスユニットを追加しないでください。
  • Requires=<SERVICE_NAME>.serviceタイマーユニットにaを追加しないでください。
  • タイマーが実行された時間を覚えて起動時に逃した実行を実行するには、Persistent=trueタイマーに追加します。
  • タイマーは起動時にかなり早く実行されるため、必要なすべての After=サービス(ネットワーク、データベースなど)がオンラインになるまでサービス単位が実行されないように、サービス単位(タイマー単位が実行される場所)に必要な要件を追加する必要があります。それ以外の場合は失敗する可能性があります。

関連情報