systemd에서 초기 처리를 동기화하는 방법.

요 전날 systemd를 사용하고 있습니다.
  • "한 서비스 (A)의 한 프로세스 (B)가 정상적으로 종료 된 후 다른 서비스 (C)를 시작하고 싶다."
  • "한 서비스 (A)의 한 프로세스 (B)가 비정상적으로 종료되면 다른 서비스 (C)가 시작되지 않게한다."

    라는 상황이 되었습니다.

    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
  • 좋은 웹페이지 즐겨찾기