2014-10-31 1 views
0

현재 cgroup 외부의 systemd 서비스에서 외부 프로그램을 실행해야합니다. systemd-run이 도구는 아마도이 문제를 해결할 수 있지만 아직 사용할 수없는 systemd 버전 204가 붙어 있습니다. 다른 해결책이 있습니까? 자세히독립적 인 cgroup에서 systemd 서비스에서 외부 프로그램을 실행하는 방법

내 문제 :

응용 프로그램은 데비안 패키지에 번들로 제공되며 설치하고 systemd 서비스로 자신을 실행합니다. 이 서비스는 나중에 최신 버전의 응용 프로그램을 다운로드하고 dpkg -i myapplication.deb을 실행합니다. 업그레이드 설치 중에 서비스를 중지해야하지만 cgroup의 모든 프로세스가 끝날 때까지 서비스가 중지되지 않습니다. dpkg 자체가이 cgroup에서 실행 중이기 때문에 교착 상태에 빠졌습니다. 서비스 중지 시간 초과 후 dpkg이 종료되고 업그레이드가 설치되지 않습니다.

답변

1

/run/systemd/system 경로에서 서비스를 동적으로 만들 수 있습니다. 이 경로는 런타임 서비스 디렉토리입니다.

나중에 systemd에게 상태를 다시로드하도록 지시합니다. 다시로드가 완료되면 이제 systemd가 서비스에 대해 알고 있습니다. 서비스 시작은 서비스 자체 cgroup에서 이루어집니다. 에 StackOverflow에

#!/bin/sh 

printf "[Service]\nType=oneshot\nExecStart=dpkg -i myapplication.deb" \ 
> /run/systemd/system/my-dpkg.service 
if [ -f "/run/systemd/system/my-dpkg.service" ]; then 
    systemctl daemon-reload && \ 
    systemctl start dpkg.service 
fi 
+0

에 오신 것을 환영합니다 :

난 당신이 뭔가를 할 수있을 것. 거의 언제든지 코드를 게시하거나 서식을 유지하려는 데이터는 네 칸 (또는 탭)으로 들여 쓰기 할 수 있습니다. #는 표제어의 마크 업 단축 코드이므로'#!/bin/sh' 대신에!/bin/sh를 큰 텍스트로 보았습니다. backticks (QWERTY 위의 1 키 옆에있는 아포스트로피 모양의 것)로 인라인 코드를 수행 할 수 있습니다. Hello World를''로 둘러싸면'Hello World'가 생깁니다. –

관련 문제