systemd에 서비스가 설정되었음을 알리는 서비스를 올바르게 생성하려면 어떻게 해야 합니까?

systemd에 서비스가 설정되었음을 알리는 서비스를 올바르게 생성하려면 어떻게 해야 합니까?

소규모 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 대신 보기 서비스에 의존합니다.

관련 정보