systemd에서 초기 처리를 동기화하는 방법.
라는 상황이 되었습니다.
systemd.service는 [Unit]의 After에서 부팅 순서를 정의할 수 있습니다.
하지만, 그냥,
ExecStart
를 실행하는 순서가 정의되는 것이므로,어느 처리(B)가 특히 시간이 걸리는 처리였던 경우는(C)의 기동이(A)를 추월해 버립니다.
그래서 (A)에 대해 조금 세공을 하기로 했습니다.
전제 조건
Linux계 OS의 systemd를 사용하고 있는 것.
우분투에서 실시하고 있지만 다른 OS에서도 똑같이 움직인다고 생각합니다.
서비스 (C) systemd.service
서비스(C)의 systemd.service의 [Unit] 정의를 이하로 합니다.
C.service
[Unit]
After = A.service
Requires = A.service
서비스(A)의 systemd.service
서비스(A)의 systemd.service의 [Service]Type을 notify로 합니다.
매뉴얼
A.service
[Service]
Type = notify
이렇게 하면 서비스 A의 프로그램 코드와 연계할 수 있게 됩니다.
코드로부터 통지를 받은 타이밍에서 기동 처리가 정상적으로 종료된다는 의미가 됩니다.
서비스 (A)에 sdnotify를 포함시킵니다.
이번은 cpp로 쓰여진 서비스였으므로, 여기 를 참고로, notify의 처리를 임베드합니다.
포함할 위치는 동기화를 원하는 프로세스가 정상적으로 종료되는 시점입니다.
#include <systemd/sd-daemon.h>
main(){
//
// 処理(B)
//
sd_notify(0, "READY=1");
//
// main処理
//
}
매뉴얼
초기화 처리를 plot 해 본다.
systemd-analyze plot > foo.svg
점선 부분이 systemd에 의한
ExecStart
로부터, Type=notify
되기까지의 시간이 plot 된 것입니다.처리(B)를 실시하고 있는 시간이 빨갛게 되었습니다.
※서비스명은 공개할 수 없기 때문에 숨기고 있습니다.
각 언어의 sdnotify는 이쪽
검증은 하지 않지만 go, python의 sdnotify입니다.
htps : // 기주 b. 이 m/이것 s/고-sys md/bぉb/마s r/다에몽/sd후 fy. 고
htps : // 기주 b. 코 m / b4242 / sd 후 fy
Reference
이 문제에 관하여(systemd에서 초기 처리를 동기화하는 방법.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kosuke-n/items/105f266364f1275a9a63텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)