Não é necessário usar um script preinst para instalar arquivos .deb. Você pode simplesmente adicionar dependências e, em seguida, empacotar usando um arquivo, e quaisquer dependências e pré-dependências serão instaladas automaticamente.
Eu tenho meu próprio aplicativo empacotado usando o dpkg. O aplicativo depende de vários arquivos .deb que estou tentando instalar a partir do script preinst do meu aplicativo. O script preinst verifica se um arquivo deb dependente está instalado, senão vai instalá-lo usando o comando dpkg -i
. Isso é repetido para todos os arquivos deb dependentes do aplicativo principal.
Quando tento instalar o aplicativo principal usando dpkg -i
, os comandos retornam uma falha ao tentar executar o script preinst. Abaixo está essa mensagem de erro:
dpkg: error: dpkg status database is locked by another process
Eu excluí o arquivo /var/lib/dpkg/lock
e tentei instalar novamente o aplicativo. Mas sem sucesso. Se eu executar o script preinst separadamente, como qualquer outro script de shell, ele será executado sem nenhum problema. Todos os arquivos deb serão instalados corretamente. Então, o problema é apenas quando este script preinst está sendo executado automaticamente pelo dpkg -i command
.
Estou perdido tentando determinar a causa raiz. Se alguém puder esclarecer qual seria o problema real, sua ajuda será muito apreciada.
Obrigado, ObsessiveSS0F pela sua resposta rápida.
Eu entendo o ponto que você está fazendo, mas isso não ajudará na minha situação. Deixa-me dizer-te porquê.
Continuei a investigar o motivo pelo qual o preinst não estava conseguindo instalar os arquivos .deb e acho que descobri o motivo.
Eu modifiquei o script preinst para fazer backup dos bloqueios criados pelo processo dpkg em um local temporário e excluí os bloqueios originais. (o comando lsof relatou que o bloqueios foram excluídos). Agora que os bloqueios foram eliminados, os comandos dpkg -i dentro do script preinst foram executados sem nenhum problema. Eu restaurei os bloqueios antes de sair do script preinst para que o comando primário dpkg -i pudesse continuar. Funcionou, mas tenho a sensação de que essa não é a abordagem correta.
Ainda estou tentando descobrir maneiras alternativas de instalar um arquivo .deb junto com suas dependências.
Não é necessário usar um script preinst para instalar arquivos .deb. Você pode simplesmente adicionar dependências e, em seguida, empacotar usando um arquivo, e quaisquer dependências e pré-dependências serão instaladas automaticamente.
O pensamento de embaralhar arquivos de bloqueio me deixa desconfortável. Se é garantido não mexer com a instalação do aplicativo, então não parece que deve haver um problema, mas acredito que o script de pré-instalação é mais para coisas como parar os serviços que serão afetados pela instalação.
Parece que a causa raiz do problema é que o script de pré-instalação está sendo enviado pela operação do dpkg após o arquivo de bloqueio ter sido configurado. Parece provável que a maneira correta de fazer isso seja separar a instalação das dependências ou recompilar o aplicativo para que ele funcione com um ppa local e instale as dependências corretamente.
Eu estou querendo saber se não seria melhor configurar as dependências com --set-selection e processá-las com o dpkg antes ou depois de instalar o aplicativo. As dependências podem ser carregadas com:
sudo dpkg --set-selections & lt; dependency_files
Onde o dependency_files está no formato, por exemplo:
samba install
samba-common install
samba-common-bin install
samba-ldb-tools install
samba4 install
samba4-common-bin install
Eu acredito que os arquivos podem ser instalados com
dpkg --selected-only
Pode até ser possível que o seu script de pré-instalação possa ser usado para a parte --set-selections da operação, pelo menos.
Quanto à re-embalagem, não posso ser de ajuda alguma, mas parece haver uma comunidade de mantenedores de pacotes que poderia ajudar: