ファイルが存在する場合のシステムサービスの遅延

ファイルが存在する場合のシステムサービスの遅延

ConditionPathExists=ファイルが存在します(ファイルが存在する場合はサービスが失敗するのではなく)、デバイスが何も見つからなかった場合は、サービスの開始を遅らせたいと思います。文書

システム化は技術的に可能ですか?どのように?

答え1

私が知っている限り、ConditionPathExists=デバイスを「失敗」のままにしません。ConditionPathExists=このユニットをスキップしてください。

ユニットファイルには複数のCondition… = と Assert… =設定を含めることもできます。デバイスが起動する前に、systemdは指定された条件が真であることを確認します。そうでない場合、デバイスの起動は(ほとんど自動的に)スキップされます。エラー状態のため、デバイスは「失敗」状態に切り替わりません。

ExecStartPre=ファイルの存在に応じてデバイスの起動を遅らせる方法の1つは、thenRestart=on-failureおよびtest filesを使用することですRestartSec=。これにより、デバイスは障害状態になりますが、成功するまで再試行します。たとえば、

[Service]
# Should cause failure if file exists
ExecStartPre=/usr/bin/test ! -f afile
ExecStart=mycommand

# Restart on failure. Keep trying to create backup.
RestartSec=10m
Restart=on-failure

答え2

1ユニットのみを使用してください

TimeoutStartSec=infinityユニットファイルを挿入し、ExecStart=次のスクリプトを使用して設定します。

#! /bin/bash

TIMEOUT=1000

test -f /path/to/testfile && sleep "$TIMEOUT"

exec /path/to/service/binary plus arguments

これは(有用な方法で)行うことはできません。ExecStartPre=以下を参照してください。man systemd.service

ExecStartPre =は長期実行プロセスを開始するためには使用できません。 ExecStartPre =で呼び出されたプロセスによって生成されたすべてのプロセスは、次のサービスプロセスが実行される前に終了します。

補助装置の使用

systemdを使用してこれを「一人で」行うには、ヘルパーユニットを作成できますcheck_and_wait.target。これはアイテムを取得します

# check_and_wait.target
[Unit]
TimeoutStartSec=infinity
ConditionPathExists=/path/to/testfile
ExecStart=/usr/bin/sleep 1000
RemainAfterExit=yes

基本デバイスは次の項目を取得します。

Wants=check_and_wait.target
After=check_and_wait.target

答え3

[Service]
ExecStartPre=bash -c "while [ -f /path/to/file ]; do sleep 1; done"
ExecStart=your_command

関連情報