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
그러나 나는 다음과 같은 이유로 이 옵션을 좋아하지 않습니다.
- 불필요하게 폴링을 계속합니다.
- 시도하면
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 파일을 폴링하는 대신 구성 시스템이 다음 서비스를 트리거하도록 하는 것이 더 좋습니다.