Script de bash que pode testar uma biblioteca específica

2

Estou escrevendo um script bash que precisa testar se certas bibliotecas estão instaladas em um VPS e, se não estiverem, o script irá instalá-las.

Meu problema é conseguir que o script determine se eles existem ou não. Minha principal ideia foi usar isso:

ldd /usr/lib/libgd.so > /tmp/lddcheck 2>/dev/null

Para enviar os resultados do ldd para um arquivo, que eu poderia pesquisar com grep ou algo para as bibliotecas que estou procurando. Se eles não estiverem lá, eu os instalarei, caso contrário, o script continuará.

Não sei exatamente como fazer isso. Qualquer ajuda seria apreciada (muito nova no bash scripting).

    
por Nate 12.01.2012 / 03:43

5 respostas

3

Dado que você irá estar usando algum tipo de gerenciador de pacotes para instalar bibliotecas, não seria muito mais fácil ter apenas uma lista de pacotes que você deseja ser instalado e garantir de alguma forma que eles estão instalados?

100% dos gerenciadores de pacotes que eu conheço têm algum tipo de modo (o modo padrão, geralmente) que instala um pacote se não estiver instalado, atualiza para a versão mais recente se estiver instalado, mas antigo e passa se já estiver atualizado.

Por exemplo, com apt-get , você sempre pode fazer apt-get install a b c d ... para garantir que os pacotes a , b , c , d estejam instalados. Com yum que seria yum install a b c d , etc.

Se você estiver usando vários sistemas com gerenciadores de pacotes diferentes em seus VPSs, acabará escrevendo alguma lógica para detectar qual gerenciador de pacotes ele usa de qualquer maneira, portanto, essa etapa é inevitável.

    
por 12.01.2012 / 08:35
1

Depois de executar o comando ldd como sugerido, você pode tentar usar algo como

grep "not found" /tmp/lddcheck | awk '// { print $1 }'

para obter os nomes das bibliotecas ausentes.

    
por 12.01.2012 / 03:55
1

Supondo que as bibliotecas que você precisa suportam, você deve usar pkg-config , é para isso que foi feito.

$ pkg-config --exists libnotify 
$ echo $?
0
$ pkg-config --exists nonexistant
$ echo $?
1
$ 

Você pode usá-lo para verificar a versão, informar os caminhos include ou libs, etc.

    
por 13.01.2012 / 05:09
0

ldd $YOURBINARY 2>&1 |grep "missing" deve produzir as bibliotecas ausentes para o seu binário.

    
por 12.01.2012 / 22:11
0

Se você é iniciante no script, lembre-se: raramente é necessário um arquivo temporário; quando você precisa executar vários estágios de processamento em alguns dados, procure um canal. Existem muitas ferramentas de processamento de texto que você pode usar na saída de ldd . Aqui, usarei awk para detectar linhas em que o terceiro campo separado por espaços em branco é not (em oposição a um caminho para uma biblioteca) e imprima o primeiro campo (o nome da biblioteca). Estou coletando a saída em uma variável que conterá uma lista separada por espaço em branco das bibliotecas ausentes.

missing=$(ldd /path/to/executable | awk '$3 == "not" {print $1}')
for x in $missing; do
  # whatever it takes to install $x
done

Note que esta provavelmente não é a abordagem correta. Se você tiver suporte para distribuições específicas, não crie um pacote binário genérico com interação personalizada com o gerenciador de pacotes. Distribuir um pacote para essa distribuição.

Os gerenciadores de pacotes facilitam muito a vida dos administradores do sistema; Não jogar bem com o gerenciador de pacotes deixará seus usuários confusos e zangados. Se você distribuir rpms e debs e assim por diante, seus usuários simplesmente precisarão instalar as dependências do seu pacote. Dessa forma, seu pacote será gravado e poderá ser instalado, atualizado e desinstalado usando a ferramenta habitual de gerenciamento de pacotes do usuário, em vez de executar algum script duvidoso.

    
por 13.01.2012 / 23:09