패키지 설치 중에 종속 서비스를 다시 시작하는 올바른 방법은 무엇입니까?


10

구성 패키지를 작성 중이며 구성이 영향을받는 서비스를 중지했다가 다시 시작하고 싶습니다. 지금 내가 사용하고 service [stop|restart]{pre,post}{inst,rm}방법. 나는 질문 어딘가에서 읽은 invoke-rc.d는 IS 바로 그것이 서비스에 대해 사용자 환경 설정을 존중하기 때문에, 방법. 그러나 이에 대한 지침을 찾지 못했습니다. 누구든지 그러한 지침을 알고 있습니까? 아니면 어떤 방법을 선택해야하는지 조언이 있습니까? 이 패키지는 내부 용으로 향후 2 년 동안 14.04 일 것입니다. 그러나 나는 내 후계자를 위해 가능한 한 깨끗한 상태를 유지하고 싶습니다 systemd. 내 마음도 마찬가지입니다.

로부터 invoke-rc.dman 페이지 :

데비안 패키지의 관리자 스크립트에 의한 init 스크립트에 대한 모든 액세스는 invoke-rc.d를 통해 이루어져야합니다 .

데비안 정책 매뉴얼 9 장 3.3 절 :

관리자는 update-rc.d 및 invoke-rc.d 프로그램에서 제공하는 추상화 계층을 사용하여 postinst, prerm 및 postrm과 같은 패키지 스크립트의 initscript를 처리해야합니다.

...

패키지 관리자 스크립트는 직접 호출하는 대신 invoke-rc.d를 사용하여 /etc/init.d/* 초기화 스크립트를 호출해야합니다.

데비안은 이미 사용 sysv-init중이며로 바로 systemd넘어갈 것입니다. 정책 매뉴얼은 시간이 지남에 따라 업데이트 될 것으로 생각합니다 systemctl. 그러나 내가 확실하지 않은 것은 이것입니다 : invoke-rc.d대신 사용해야합니까 service? dpkg트리거를 통해 일부 파일에 관심이 있다고 말할 수 있으므로 dpkg일부 서비스에 관심 dpkg이 있고 다시 시작 / 다시로드를 수행 할 수있는 방법이 있습니까?

명확히하기 위해 : 나는 init 스크립트를 작성하지 않습니다. Puppet, NTP 등과 같은 다른 응용 프로그램에 대한 구성을 가진 패키지를 제공하고 있으므로 스크립트에서 해당 서비스를 중지했다가 다시 시작합니다.

예를 들어 여기invoke-rc.dvs 에 대한 Docker 문제가 service있습니다. 한 사람, 아마도 관리자 인이 문제는 여전히 열려 있는데, 그들이 올바른 방법 으로이 일에 관심을 갖고 있다고 분명히 말하고 있습니다. (제 질문은 그 문제와 무관합니다.)

답변:


5

나는 사전 / 사후 inst 스크립트를 계속 사용하고

preinst-이 스크립트는 패키지가 데비안 아카이브 ( ".deb") 파일에서 압축 해제되기 전에 실행됩니다. 많은 'preinst'스크립트 는 설치 또는 업그레이드가 완료 될 때까지 ( 'postinst'스크립트의 성공적인 실행에 따라) 업그레이드중인 패키지에 대한 서비스중지합니다 .

postinst-이 스크립트는 일반적으로 foo가 데비안 아카이브 ( ".deb") 파일에서 압축 해제되면 패키지 foo의 필수 구성을 완료합니다. 종종 'postinst'스크립트는 사용자에게 입력을 요청하거나 사용자에게 기본값을 수락하면 상황에 따라 패키지를 다시 구성해야 함을 경고합니다. 그런 다음 많은 'postinst'스크립트 는 새 패키지가 설치되거나 업그레이드되면 서비스를 시작하거나 다시 시작하는 데 필요한 명령 을 실행합니다 .

참조 -https : //www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html

start | stop | restart를 호출하는 구문은 조건부로 작성됩니다. https://www.debian.org/doc/debian-policy/ch-opersys.html 섹션 9.3.3.2 initscripts 실행을 참조 하십시오.

만약 invoke-rc.d> / dev / null 2> & 1; 그때

invoke-rc.d 패키지

그밖에

/etc/init.d/package

fi

그래서 ...

if which service >/dev/null 2>&1; then
        service package <action>
elif which invoke-rc.d >/dev/null 2>&1; then
        invoke-rc.d package <action>
else
        /etc/init.d/package <action>
fi

필요할 때 systemd에 다른 조건을 추가하십시오.)

따라서 서비스를 시작 / 중지하는 올바른 방법은 가능한 경우 적절한 래퍼 스크립트 (invoke-rc.d / system)를 사용하는 것이 아니라 init 스크립트 (/etc/init.d/package)를 호출하는 것입니다. 랩퍼를 사용할 수 없으면 /etc/init.d 스크립트로 돌아갑니다.


그것은 하나를 제외한 대부분의 의심에 대한 답변입니다. invoke-rc.d매뉴얼 페이지 및 데비안 정책 워드 프로세서와 관련하여 그것을 사용하는 우리에게 /etc/init.d/(그들은 여전히 SYSV - 초기화를 사용 가능하게하기 때문에) 스크립트. Upstart 또는 systemd에서 어떻게 변경됩니까?
muru

질문을 업데이트하거나 읽고있는 정보에 대한 링크를 게시하십시오. 맨 페이지에는 포장에 관한 내용이 없습니다. 그래서, 나는 당신의 서비스 및 당신은 askubuntu.com에 요구되는 init 스크립트입니다 (그 신출내기? systemd?)에 따라 가정, 그리고 우분투는 신출내기 사용 askubuntu.com/questions/58404/how-to-start-and-stop 서비스 . 패키지가 이전 init 스크립트를 사용하는 경우 지금은 upstart로 변환하여 장기적으로 시스템화 해야 합니다.
Panther

질문을 업데이트했습니다.
muru

"그것에 의존한다"라는 질문에 대한 쉬운 대답은 하나도 없습니다. 이것은 우분투와 데비안이 모두 systemd를 사용할 것이므로 일시적인 상황입니다. upstart를 사용하는 서비스의 경우 sysv-init 및 service ...를 사용하는 데비안 (또는 Ubuntu)의 서비스에는 invoke-rc.d를 사용해야합니다. 스크립팅이므로 필요한 경우 창의력을 발휘하십시오invoke-rc.d ... || service ...
Panther

스크립트 구문이 아닌 in / post inst 스크립트를 사용해야하는지 묻고 있다고 생각했습니다.
Panther

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.