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