![시스템 동적(런타임) 종속성](https://linux55.com/image/82389/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EB%8F%99%EC%A0%81(%EB%9F%B0%ED%83%80%EC%9E%84)%20%EC%A2%85%EC%86%8D%EC%84%B1.png)
임베디드 장치에는 기본 애플리케이션과 여러 서비스가 있습니다. 주요 애플리케이션과 서비스는 systemd에 의해 관리됩니다.
기본 애플리케이션에는 플러그인 시스템이 있으며 해당 플러그인은 런타임 시 활성화되거나 비활성화될 수 있습니다. 우리가 가지고 있다고 가정 PluginA
하십시오 PluginB
. 두 플러그인 모두 서비스가 필요합니다. 이를 이라고 부르겠습니다 ServiceP
.
이제 플러그인이 하나만 있는 경우 ServiceP
로드하는 동안 서비스를 시작하고 언로드하는 동안 서비스를 중지합니다. 하지만 두 개의 플러그인이 있고 수명 주기가 겹칠 수 있으므로 동적 종속성 또는 참조 카운터가 필요합니다.
PluginA loaded --> start ServiceP
PluginB loaded --> do nothing (already started by PluginA)
PluginA unloaded --> do nothing (still required by PluginB)
PluginB unloaded --> stop ServiceP
systemd를 사용하여 이를 수행할 수 있는 방법이 있습니까?
나는 그렇게 생각하지 않습니다. 왜냐하면 systemd가 전체 애플리케이션을 관리하기 때문입니다. 따라서 참조 카운터를 직접 구현하면 다음과 같은 결과를 얻을 수 있습니다.
# case 1
App starts (don't start ServiceP, app didn't request it yet)
App says it needs ServiceP --> start ServiceP
App says it no longer needs ServiceP --> stop ServiceP
# case 2
App says it needs ServiceP --> start ServiceP
App stops/crashes --> stop ServiceP
...
유닛 파일에 종속성을 추가/제거하고 다시 로드하면 쉽게 달성할 수 있다고 생각합니다. 하지만 App
충돌이 발생해도 멈추지 않으므로 ServiceP
에서 정리를 수행해야 합니다 ExecStopPost=
. 이는 systemctl daemon-reload
유닛 파일에서 호출하는 것을 의미하는데 이는 올바르지 않은 것 같습니다. 더 나은 해결책이 있습니까?