패키지가 업데이트되면 스크립트를 실행하시겠습니까?

패키지가 업데이트되면 스크립트를 실행하시겠습니까?

내 서비스를 관리하기 위해 runit을 사용하고 있으며 새 버전의 nginx를 설치할 때 sv restart nginx.

패키지 또는 패키지 그룹의 업그레이드를 모니터링하고 업그레이드 시 스크립트를 트리거하는 방법이 있습니까?

답변1

데비안을 사용하고 있으므로 가능한 한 가지 방법은 apts 내장 메커니즘을 사용하는 것입니다. 업데이트 시 스크립트를 실행하도록 Apt를 구성할 수 있습니다.

예를 들어, apt-listchanges특히 새로운 변경 로그 항목을 표시하여 "현재 시스템에 설치된 버전과 비교하여 데비안 패키지의 새 버전에서 변경된 내용을 표시하는 데 사용되는 도구"인 package 를 참조하세요. 패키지에는 /etc/apt/apt.conf.d/20listchanges업데이트 시 쉽게 실행할 수 있는 스크립트가 포함되어 있습니다. 그게 스크립트의 전부입니다.

DPkg::Pre-Install-Pkgs { "/usr/bin/apt-listchanges --apt || test $? -ne 10"; };
DPkg::Tools::Options::/usr/bin/apt-listchanges::Version "2";

이러한 스크립트는 일반적으로 apt에 Perl 또는 Python 바인딩을 사용합니다. /usr/bin/apt-listchangesPython 스크립트이며 Python 바인딩을 사용합니다.

예를 들어 데비안 위키(Debian Wiki)의 다소 개략적인 문서를 참조하세요. 회의 회의.

답변2

당신(당신)은 할 수 있어요dpkg패키지 관리 작업 전후에 명령을 실행합니다. 옵션에 따라 명령은 작동 특성으로 설정된 환경 변수로 실행됩니다. 이러한 후크는 패키지당 한 번이 아니라 호출당 한 번 실행되고, 프로세스가 수행할 작업이나 수행한 작업을 알려주는 방법을 제공하지 않기 때문에 매우 편리하지 않습니다. 무슨 일이 일어나고 있는지 알아내는 간접적인 방법은 작업 전후에 관심 있는 패키지의 상태를 기록하고 상태가 변경되면 사용자 지정 작업을 호출하는 것입니다. log()를 구문 분석하여 이 정보를 얻을 수도 있습니다.--pre-invoke=COMMAND--post-invoke=COMMANDDPKG_HOOK_ACTIONdpkgdpkg/var/log/dpkg.log


보다 구체적인 해결책은 문제에 대해 데비안에서 제공하는 표준 메커니즘을 사용하는 것입니다. 패키지 nginx(또는 nginx-light) nginx-fullinvoke-rc.d nginx start설치 후( ) 스크립트 postinst의 일부 와 invoke-rc.d nginx stop제거 전( ) 스크립트의 일부로 prerm호출됩니다 . 명령을 invoke-rc.drunit 및 호출에 맞게 특별히 사용자 정의된 명령으로 바꾸 sv십시오.dpkg-divert그 이유는 다음과 같습니다.

dpkg-divert --add --rename --divert /usr/sbin/invoke-rc.d.sysvinit /usr/sbin/invoke-rc.d
ln -s invoke-rc.d.runit /usr/sbin/invoke-rc.d

invoke-rc.d또는 자신이 수정한 사본을 sv경로 에 넣으십시오 /usr/sbin(예: ) /usr/local/sbin.

이 스크립트는 구현을 담당 /usr/sbin/invoke-rc.d.runit할 수 있습니다./usr/sbin/invoke-rc.dinvoke-rc.d상호 작용:

  • ACTION이 , , 중 하나인 구문을 지원합니다.invoke-rc.d SERVICE ACTIONstartstoprestartforce-reloadreload
  • 이 옵션은 지원됩니다 --quiet(내 시스템의 패키지 유지 관리 스크립트에서 사용되는 것을 본 유일한 옵션이며 모든 데비안 패키지를 철저하게 검색하지는 않았습니다).
  • /usr/sbin/policy-rc.d필요한 경우 매뉴얼 페이지에 설명된 대로 호출하십시오(예를 들어 chroot 또는 컨테이너에서 서비스를 실행하지 마십시오).

runit을 사용하여 Nginx를 관리하려는 경우 invoke-rc.d서비스 이름이 가 아니면 표준 실행을 사용하십시오 nginx.


모든 것을 고려해 볼 때 Runit을 사용하여 Nginx를 관리하려는 경우 전송(또는 심지어 편집 - 구성 파일임)이 /etc/init.d/nginx가장 쉬운 방법인 것 같습니다. 기존 스크립트를 시작점으로 사용하고 호출을 start-stop-daemon적절한 호출 로 바꾸십시오 nv.

관련 정보