다중 인스턴스 LSB 스크립트를 systemd로 마이그레이션하는 방법은 무엇입니까?

다중 인스턴스 LSB 스크립트를 systemd로 마이그레이션하는 방법은 무엇입니까?

저는 데몬의 여러 인스턴스를 관리하는 LSB init 스크립트를 작성했습니다. 모든 인스턴스를 시작하고( rcfoo start일부 구성 파일에 있음) 모든 인스턴스를 중지하고 모든 인스턴스의 상태를 표시한 다음 변경된 구성 프로세스로 데몬을 다시 로드하고 업데이트합니다./etcrcfoo stoprcfoo statusrcfoo reload

[email protected]먼저 일부 시스템 단위 파일과 함께 사용할 인스턴스를 감지하는 방법을 알고 싶습니다. AFAIK 등 모든 인스턴스를 지정해야 합니다 foo@A.foo@B

둘째, 내 LSB 스크립트는 확장 상태를 보고할 수 있습니다. 즉, reload서비스가 필요한지 여부를 표시할 수 있습니다( reload실제로 내 LSB 스크립트는 필요한 서비스만 다시 로드하도록 최적화되어 있습니다). 사용자 정의 상태 보고서를 만들려면 어떻게 해야 합니까? systemd-notify상태 메시지를 사용자 정의 하려면 스크립트를 사용해야 한다고 생각합니다 .

다행스럽게도 단일 인스턴스에 작업을 추가하여 LSB 스크립트에 대한 최종 확장 single <instance>(예: rcfoo start single A)이 systemd에서 기본적으로 지원됩니다.

그래서 나의 기본적인 질문은 질문 1번입니다.

답변1

두 가지 가능한 해결책을 찾았습니다.

  1. 인스턴스 인수와 명령 인수를 허용하는 "래퍼 스크립트"를 작성합니다. 그런 다음 스크립트는 요청된 인스턴스가 실제로 구성 파일에서 발견되는지 검색해야 합니다 /etc. 스크립트는 실제로 start, stop, 및 을 제공 reload하지만 데몬 프로세스의 PID는 를 통해 systemd에 의해 처리됩니다 PIDFile=.

    [email protected]또한 등에 대한 래퍼 스크립트가 포함된 서비스 단위를 작성합니다 . 인스턴스 이름이 여기에 표시됩니다. 별로 좋지 않은 사실은 인스턴스 이름을 알아야 하며 잘못된 인스턴스 이름이 사용되면 systemd는 반복적으로 다시 시작되는 비작동 인스턴스를 생성한다는 것입니다(수동 정리가 사용될 때까지). 이 방법은 조건부 재시작 문제를 해결하지 못합니다. 그렇게 될 것입니다.ExecStart=ExecStop=%isystemctl reset-failedsystemctl start foo@A

  2. 또는 구성 파일을 읽고 발견된 각 인스턴스에 대한 서비스 인스턴스 단위 파일을 생성하는 생성기를 작성하여 래퍼 스크립트를 제거할 수 있습니다. 사용된 명령줄은 구성 파일을 사용하여 생성기에 의해 어셈블됩니다. 생성기는 ExecStartPre=추가 셸 명령을 전달하고 추가합니다(예: 런타임 디렉터리 생성 또는 데몬 포크가 완료될 때까지 대기) ExecStartPost=.

    아직 해결해야 할 몇 가지 문제가 있지만 개발 목록에 표시된 systemd 커뮤니티는 실제로 도움이 되지 않습니다. 그들은 제너레이터가 고급 개념이라고 말합니다.난 그걸 사용하면 안 돼, 실제로 내 질문에 대답하지 않습니다.

이 답변에서 누락된 내용은 다음과 같습니다. 모든 서비스를 시작하고 중지하는 sytemd 대상을 어떻게 구성합니까? 하나쯤 있으면 좋겠다고 생각했는데 시작 시 실패했습니다(알 수 없는 이유로 결과 유닛 파일이 비어 있음).

관련 정보