特定の検査でRC 0が返された後にsystemdサービスを開始します。

特定の検査でRC 0が返された後にsystemdサービスを開始します。

systemd を使用してシステムを起動すると、1 つのサービスが正常に起動できます。しばらくすると、サービスは特定の構成をシステムに適用します。

一度その設定を適用した後、crondという別のサービスを起動したいと思います。設定が適用されたことを確認するコマンドがあります。コマンドが戻りコード0を返した場合は、別のサービスクローンを開始する必要があります。

コマンド例:

grep something file.txt#これは小切手です。 file.txt に「何か」がある場合、RC 0 が返されます。

サービスの開始後に設定が適用されるため、使用After=できません。Before=これはすぐには行われず、最大30秒かかることがあります。

尋ねる:特定のチェックの戻りコードが0の後に開始されるようにsystemdサービスを構成する方法は?

答え1

たとえば、foo設定を有効にしますbar

foo.service:

[Unit]
Description=Configuration Service
Before=bar.service

[Service]
Type=notify
ExecStart=/path/to/script

次に、次の/path/to/scriptものを含めます。

#!/bin/bash

/usr/locan/bin/do_configuration.sh

# Make sure the configuration is actually valid
if grep -q something file.txt; then

# send a signal to systemd that the unit is good. 
  systemd-notify --ready

# systemd will continue to launch dependent services
  exit 0

else
  systemd-notify ERRNO=2
  exit 1
fi

試してみる価値があると思います。 ARequiredBy=またはWantedBy=依存関係が必要な場合があります。


ExecStartPre=別のオプションは、次の内部で使用することですbar.service

#!/bin/bash
while :
do
   if grep -q something file.txt
   then
    break
   fi
done

しかし、私は次の理由でこのオプションが好きではありません。

  1. 不必要にポーリングを続けます。
  2. 試行すると、systemctl start bar条件が満たされるまでsystemctlが停止します。

答え2

複数の試行を避けるために、再起動オプションとBefore一緒にsystemdサービスを使用できます。ExecStartRestartSec

[Unit]
Description=Foo
Before=the other service

[Service]
ExecStart=grep -q something file.txt
Restart=on-failure
RestartSec=10s

ただし、/grep ファイルをポーリングする代わりに、構成システムに次のサービスをトリガーさせることをお勧めします。

関連情報