web-dev-qa-db-ja.com

systemd oneshot一度だけ実行する要件

生成されたEnvironmentFileを必要とする複数のsystemdサービスがあります。この環境ファイルを生成するシェルスクリプトがありますが、環境ファイルbefore Exec ...コマンドを実行する必要があるため、ExecStartPre = generate_env_file.shを使用できません。したがって、別のサービス(generate_env_file.service)を設定して、そのスクリプトをワンショットとして実行します。

[Service]
Type=oneshot
ExecStartPre=/usr/bin/touch /path/to/config.ini
ExecStart=/path/to/generate_env_file.sh

そして、私は持っている他の複数のサービスファイルを持っています:

[Unit]
Requires=generate_env_file.service
After=generate_env_file.service

2つ以上の依存サービス(generate_env_file.serviceを必要とする)が並行して実行されず、generate_env_file.serviceの2つの並行実行が生成されることをどのように保証できますか?

RemainAfterExit = trueまたはStartLimitIntervalSec =およびStartLimitBurst =を使用して、ある期間中に一度に1つのコピーのみが実行されることを確認しましたが、これを実行する最善の方法がわかりません。

3
WesleyOldaker

RemainAfterExit=trueはその方法です。この場合、Systemdはサービスを開始し、Systemdはそれを開始済みでライブと見なします。ただし、これはsystemctl restart generate_env_file.serviceを実行するユースケースには対応していません。この場合、systemdはサービスを再実行します。これを解決するには、ExecStartPost=の実行ファイルシステムにマーカーファイルを作成し、ConditionFileExists=ディレクティブを追加してファイルの存在を確認します。

2
Umut

更新generate_env_file.shが起動したらすぐにロックファイルが存在するかどうかを確認します。ロックファイルが存在する場合は、すぐに終了します。

ロックファイルが存在しない場合は、すぐにロックファイルをタッチし、構成ファイルの生成に取り掛かってから、ロックファイルを削除します。

別の言い方をすると、systemdには、設定を通じて記述している状況を処理するネイティブの方法がないと思います。ロックファイルを使用してください。

そして、@ shellterが指摘しているように、Unixサイトは、将来のsystemd質問に適したサイトです。

0
Mark Stosberg

ConditionFirstBoot も興味深いかもしれません。

0
ManuelSchneid3r