프로세스의 내부 상태가 준비될 때까지 시스템의 "시작" 상태를 연장합니다.

프로세스의 내부 상태가 준비될 때까지 시스템의 "시작" 상태를 연장합니다.

systemd로 서비스를 시작하면 프로세스는 activating일정 기간 동안만 해당 상태로 유지됩니다. active프로세스가 성공적으로 시작되면 다음으로 변환됩니다.

하지만 준비하는 데 시간이 걸리는 복잡한 서비스가 있는 경우 어떻게 해야 합니까? activating서비스가 내부적으로 준비될 때까지 상태를 어떻게 연장할 수 있나요 ?

답변1

[Service]조직 섹션 에서 추가(또는 변경)Type=notify.

이는 프로세스 자체가 시작 시 신호를 방출한다는 것을 systemd에 알려줍니다. 따라서 프로세스가 시작될 때 systemd는 프로세스가 준비되었다고 가정하지 않습니다.

이를 위해서는 프로세스를 구현해야 합니다.sd_notification(3).


다음은 C의 알림 서비스에 대한 최소한의 예입니다.

# notifier.service
[Service]
Type=notify
ExecStart=%h/bin/notifier
/* main.c */
#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 */
}
# makefile
a.out: main.c
        gcc main.c -lsystemd

install: a.out notifier.service
        install -D a.out ~/bin/notifier
        install -D notifier.service ~/.config/systemd/user/notifier.service

관련 정보