특정 검사에서 RC 0이 반환된 후 systemd 서비스를 시작합니다.

특정 검사에서 RC 0이 반환된 후 systemd 서비스를 시작합니다.

systemd를 사용하여 시스템을 시작하면 하나의 서비스가 성공적으로 시작될 수 있습니다. 잠시 후 서비스는 특정 구성을 시스템에 적용합니다.

한 번해당 구성을 적용한 후 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

시도해 볼 가치가 있다고 생각합니다. A RequiredBy=또는 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 파일을 폴링하는 대신 구성 시스템이 다음 서비스를 트리거하도록 하는 것이 더 좋습니다.

관련 정보