起動時にのみサービス依存関係を実行する方法は?

起動時にのみサービス依存関係を実行する方法は?

長い間実行されるsystemdサービスがあります。これをと呼びますdb.service。システムの起動時に起動できますが、手動で再起動することもできます。

また、データベースファイルの整合性チェックを実行するoneshotサービス(このように呼びます)もあります。check.service

check.serviceシステムの起動時に実行する必要があり、起動中にdb.service失敗した場合は起動しないでくださいcheck.service

しかし!ここに警告があります。check.service手動サマリーを使用するときは実行しないでください。起動が失敗した場合でも、手動で起動する必要があります。db.servicesystemctl restart db.servicedb.servicecheck.service

質問

systemdサービスを使用してこれを達成する方法はありますか?

思考と観察

  • RequiredBy=db.serviceinを使うとこれを達成できると思いますcheck.service。ただし、check.service起動時にはまだトリガーされます。db.service

  • db-boot.serviceブートdb.servicecheck.service. しかし、私は方法を知りませんでした。

答え1

あなたは一緒にcheck.serviceいる必要があり、また、必要があり、注文する必要があります。Type=oneshotRemainAfterExit=yesWantedBy=db.serviceBefore=db.service

その後、起動時(またはデータベースが起動時に起動するように設定されていない場合は、データベースが最初に起動する前)が完了するまで実行し、状態をcheck.service維持します。active (exited)したがってdb.service、再起動すると既にcheck.service有効になっていて依存関係が満たされ、check.service再起動されません。

この設定では、check.service起動に失敗した場合はdb.service起動しません(ただし、Want依存関係が代わりに使用されるため、Requireシステムの残りの部分はパニックモードに移行せず、正常に起動します)。後で手動で起動する場合は、まず正常に実行する必要がdb.serviceあります。正常に実行したら、勝手に起動して停止できます。check.servicecheck.servicedb.service


失敗したときに手動で起動できるdb.service必要がある場合は、自動的にまったく起動しないように設定し、代わりに起動するように設定できます。check.servicedb.servicesystemctl disable db.serviceWantedBy=db.servicecheck.servicecheck.servicesudo systemctl start db.service そして、もし確認に成功しました。

これにより、手動起動時に実行する必要がある依存関係はcheck.serviceありませんが、データベースはスキャンが成功した場合(おそらく起動時に)のみ自動的に起動されます。db.servicecheck.service

関連情報