소규모 IoT 프로젝트에는 다음과 같은 종속성이 있습니다.
MySqlServer <장치 서버<웹 서버
MySqlServer가 시작 및 설정되지 않은 경우 DeviceServer를 시작할 수 없습니다. Device Server가 없으면 웹 서버를 시작할 수 없습니다.
Requires, After
을 (를) 사용하고 있지만 .service
장치 서버가 코드를 반환하지 않습니다. 장치 서버는 호출된 후에 결코 반환되지 않습니다. DeviceServer가 이제 설정되었으며 다른 서비스에서 사용할 수 있음을 systemd에 알리는 방법을 알고 싶습니다.
저는 설치가 완료된 후 부모로서 분기하고 반환할 수 있다고 생각했습니다. 그러면 그 아이는 입양될 것입니다. 하지만 그런 다음 service reload
등을 사용하지 않으려 고 노력할 수 있습니다 .
그렇다면 DeviceServer가 코드를 반환하고 계속 실행되도록 하려면 어떻게 해야 할까요?
도와 주셔서 감사합니다!
답변1
여기서 일반적인 대답은 다음 Type=notify
을 사용하여 서비스를 구현하는 것 입니다.sd-notify
. 즉, 서비스를 시작하면 activating
프로세스가 시스템에 준비가 되었음을 "알릴" 때까지 해당 상태가 유지됩니다. 이 알림이 발생하면 서비스는 이 active
상태로 전환됩니다.
[Service]
유닛 파일의 섹션에는 다음이 포함되어야 합니다.
[Service]
Type=notify
ExecStart=webserver
그런 다음 웹 서버에 유사한 코드를 추가합니다.
#include <systemd/sd-daemon.h>
#include <unistd.h>
int main(void) {
/* Sleep to emulate 10s bootup time */
/* Expect status 'activating (start)' during this */
/* `systemctl start`, will block */
sleep(10);
/* Send a signal to say we've started */
sd_notify(0, "READY=1");
/* Units which are After= this unit will now start */
/* `systemctl start` will unblock now */
/* Sleep to emulate 10s run time */
/* Expect status 'active (running)' during this */
sleep(10);
/* Send a signal to say we've started the shutdown procedure */
sd_notify(0, "STOPPING=1");
/* Sleep to emulate 10s shutdown */
/* Expect status 'deactivating' during this */
sleep(10);
return 0;
/* Expect status 'inactive (dead)' at this point */
}
ExecStartPre=/bin/sleep 60
이는 실제 이벤트를 기반으로 트리거되기 때문에 단순한 종속 서비스보다 훨씬 우수합니다 . 귀하의 서비스가 미리 준비되면 귀하의 가족은 가능한 한 빨리 시작될 것입니다. 60초 이내에 준비가 되지 않으면 가족은 필요에 따라 기다리게 됩니다.
앱 개발자가 아닌 경우 앱이 준비가 되었음을 외부 세계에 알리는 방법을 파악해야 합니다. 파일에 기록할 수도 있고, 의미 있는 결과를 반환할 때까지 wget을 계속 사용할 수도 있습니다. 이 경우 MySqlServer와 동시에 시작되는 감시자 서비스를 생성할 수 있습니다. 그런 다음 사용 가능한 모든 정보를 기반으로 알림이 처리됩니다. 이 경우 DeviceServer는 MySqlServer 대신 보기 서비스에 의존합니다.