一般化する
無効な(「静的」)システムサービス単位で、再起動するたびにタイマーによってトリガーされて実行される必要があります。
背景
/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=
サービス(ネットワーク、データベースなど)がオンラインになるまでサービス単位が実行されないように、サービス単位(タイマー単位が実行される場所)に必要な要件を追加する必要があります。それ以外の場合は失敗する可能性があります。