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