systemd:システムがダウンしたときにジョブを定期的に一度実行する方法は?

systemd:システムがダウンしたときにジョブを定期的に一度実行する方法は?

定期的に(たとえば、5分ごとに)ジョブを実行し、最後にシステムがシャットダウンしたときにジョブを実行したいと思います。

Systemdは、定期的にジョブを実行するために使用できるタイマーをサポートしています。また、ExecStop次のフックを使用して、システムのシャットダウン時にジョブの実行をサポートします。

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=<some command to run at system shutdown>

しかし、2つのアプローチを組み合わせるのに問題があります。私が考えることができる唯一のオプションは、2つの別々のサービスを作成することです。

  1. タイマー操作によってトリガーされるサービス
  2. ExecStopシステムのシャットダウン時に実行するためにこのトリックを使用する別のサービス

私はそれがうまくいくと思いますが、このアプローチには2つの問題があります。

  1. セキュリティ設定に関するコードの重複が多い
  2. systemd は、ジョブが並行して実行されるのを防ぐことはできません。たとえば、定期的なジョブの実行中にシャットダウンがトリガーされると、両方のジョブが並列に実行されます。

質問:

  • 定期的にジョブを実行し、システムがダウンしたときに一度だけジョブを実行する最良の方法は何ですか?
  • 2つの(ほとんど重複した)サービスファイルを持つことを防ぐことはできますか?

コードの重複が何を意味するのかを理解するためにタスクを実行するときに使用するいくつかのセキュリティ設定は次のとおりです。

User=foo
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
NoNewPrivileges=yes
PrivateDevices=yes
PrivateUsers=yes
CapabilityBoundingSet=
AmbientCapabilities=
SystemCallFilter=~@clock @module @mount @obsolete @raw-io ptrace
ReadOnlyPaths=-/some/path

私が書いた方法では、このコードをコピーする必要があります(サービスごとに1つのコピー)。

答え1

foo-at-shutdown.service.d「foo-periodic.service.d」という2つのディレクトリを作成することで、重複する問題を解決できます。

1つのフォルダにfoo-shared.conf。というファイルを作成し、
シンボリックリンクを使用して2番目のフォルダに追加します。

これは「プラグイン」デバイスで、デフォルトのプロファイルにインポートされます。man systemd.unitそこで「drop-in」で検索すると、より多くの記録があります。

私の考えでは、2つのサービスファイル、タイマーファイル、共有挿入単位ファイルを持つことが合理的なアプローチだと思います。

関連情報