내 목표는 시스템이 특정 상태가 아닌 경우 특정 패키지의 설치/업그레이드를 비활성화하는 것입니다(일부 업그레이드 전 작업이 완료되어야 함).
후크를 시도했지만 DPkg::Pre-Invoke
매개변수가 수신되지 않습니다.
DPkg::Pre-Invoke { "echo >&2 PREINVOKE [$@]"; };
그냥 인쇄해
PREINVOKE []
이 후크에서 다룰 패키지 목록을 가져오는 방법이 있나요? 아니면 다른 후크가 트릭을 수행할 수 있을까요? 솔루션은 이상적으로 시스템 전체에 적용되므로 apt-get
불행히도 alias 명령을 사용하는 솔루션은 실현 가능해 보이지 않습니다.
답변1
주의 깊게 사용하면 작업을 완료하는 데 도움이 될 수 있는 또 다른 후크가 있습니다. 후크 이름은 이며 에 DPkg::Pre-Install-Pkgs
따르면 배열이기도 합니다 Pre-Invoke
.man apt.conf
이것은 dpkg(1)을 호출하기 전에 실행할 쉘 명령 목록입니다. 옵션과 마찬가지로 목록 표기법으로 지정해야 합니다. 명령을 순차적으로 호출하려면 /bin/sh를 사용하십시오. APT는 실패할 경우 중단됩니다. APT는 설치될 모든 .deb 파일의 파일 이름을 요청된 파일 설명자의 한 줄에 하나씩 명령에 전달하며 기본값은 표준 입력입니다.
아래와 같이 후크에 스크립트를 지정합니다.
DPkg::Pre-Install-Pkgs { "/usr/local/libexec/somepackage-preinstall"; }
스크립트는 인수 없이 호출되며 표준 입력에서 .deb 패키지 파일 이름 목록을 가져옵니다. 이제 스크립트를 호출하는 것뿐만 아니라 (빈 입력으로) 스크립트를 호출하는 apt-get install
것도 중요합니다 . apt-get remove
따라서 스크립트에서 사전 설치 처리가 필요한 패키지가 실제로 표준 입력에 전달된 패키지에 있는지 감지해야 합니다. 이것은 다음을 수행하여 수행할 수 있습니다.
#!/bin/bash
grep -q '/somepackage_' || exit 0
... Do what you need here ...
grep은 표준 입력의 각 파일 이름을 패키지를 고유하게 식별하는 패턴과 일치시키려고 시도하며 관심 있는 패키지를 업그레이드하는 방식으로 호출되거나 호출되지 않으면 apt-get install
스크립트가 성공적으로 종료됩니다. .deb 파일의 이름도 얻으려면 apt-get upgrade
다음 bashism을 사용할 수 있습니다.
#!/bin/bash
read debfile < <(grep '/somepackage_') || exit 0
이렇게 사용하면 $debfile
여러 패키지 파일 이름이 입력과 일치할 때 놀라움을 피하기 위해 변수가 정확히 하나의 패키지 파일 이름을 갖게 됩니다.
파일 이름은 파일 시스템 루트에서 시작된다는 점을 기억하세요 /var/cache/apt/archives/acl_2.2.52-1_amd64.deb
.
DPkg::Pre-Install-Pkgs
배열이기 때문에 여러 파일에서 이를 지정하는 모든 줄은 apt.conf.d
누적됩니다. 각 스크립트는 동일한 입력으로 호출됩니다.