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
しかし、私は次の理由でこのオプションが好きではありません。
- 不必要にポーリングを続けます。
- 試行すると、
systemctl start bar
条件が満たされるまでsystemctlが停止します。
答え2
複数の試行を避けるために、再起動オプションとBefore
一緒にsystemdサービスを使用できます。ExecStart
RestartSec
[Unit]
Description=Foo
Before=the other service
[Service]
ExecStart=grep -q something file.txt
Restart=on-failure
RestartSec=10s
ただし、/grep ファイルをポーリングする代わりに、構成システムに次のサービスをトリガーさせることをお勧めします。