Usando o rpm / grep para verificar se vários serviços estão instalados - como um liner?

0

O código a seguir é usado para verificar se um serviço (lido da variável, pode estar vazio ou até X serviços nomeados) está instalado ou não e tomar a ação apropriada.

... if ! rpm -qa | grep -qw $SERVICE; then ...

Como posso conseguir o mesmo, mas permitindo definir e ler variáveis dos seguintes formatos:

Opção - variáveis em uma linha separadas por espaço único: Exemplo: SERVICE=httpd mariadb mariadb-server

Basicamente eu quero um liner verificando se o serviço (pode ser de 0 - 99) está instalado.

Ideia completa:

SERVICE=mariadb httpd

if [ "'systemctl is-active $SERVICE'" != "active" ]; then
  if ! rpm -qa | grep -qw $SERVICE; then 
    yum -y install $SERVICE;
    echo "$SERVICE has been installed.";
  else systemctl start $SERVICE && echo "$SERVICE started"; \
  fi
fi
    
por frank 22.03.2016 / 20:45

3 respostas

1

Tente isto:

for f in $SERVICE; do if ! rpm -qa \| grep -qw $f; then ... fi; done
    
por 22.03.2016 / 20:49
1

Referindo-se ao CentOS 6, um serviço corresponderia a um dos nomes de arquivos em /etc/rc.d/init.d

Para o seu propósito, ignore o script de serviço personalizado ocasional que não vem de um RPM, e faça

for f in $SERVICE; do s=/etc/rc.d/init.d/$f; [ -f "$s" ] && rpm -qf "$s"; done

Isso verificaria a existência do arquivo de serviço e imprimiria o nome do pacote correspondente. Se o arquivo de serviço estiver faltando, nada será impresso.

Ao testar isso para sintaxe, criei um script, definindo SERVICE dos argumentos da linha de comando, por exemplo,

SERVICE="$*"

e uma entrada / saída de amostra é mostrada:

$ /tmp/foo avahi-daemon blk-availability bluetooth certmonger cgconfig cgred cpusp
eed crond
avahi-0.6.25-15.el6.x86_64
lvm2-2.02.118-3.el6_7.4.x86_64
bluez-4.66-1.el6.x86_64
certmonger-0.77.5-1.el6.x86_64
libcgroup-0.40.rc1-16.el6.x86_64
libcgroup-0.40.rc1-16.el6.x86_64
cpuspeed-1.5-22.el6.x86_64
cronie-1.4.4-15.el6_7.1.x86_64

Para fazer isso, no seu exemplo

if ! rpm -qa | grep -qw $SERVICE; then 

você poderia substituí-lo por

if [ -z "$( rpm -qf /etc/rc.d/init.d/$SERVICE 2>/dev/null )" ] ; then

Se o arquivo de serviço estiver faltando, rpm gravará uma mensagem de erro no erro padrão. Se estiver presente, mas não a partir de um RPM, rpm retornará uma mensagem para a saída padrão (o que é consistente: você não deve instalar algo para substituir um script personalizado).

Para o CentOS 7, usando systemd , você pode usar a mesma ideia, mas com um layout de diretório diferente. Ele armazena arquivos ".service" em

/usr/lib/systemd/system/

que pode ser testado como

if [ -z "$( rpm -qf /usr/lib/systemd/system/${SERVICE}.service 2>/dev/null )" ] ; then

Na minha máquina do CentOS 7

  • existem 384 arquivos unitários listados por systemctl list-unit-files
  • 101 estão desativados na configuração padrão
  • 275 são arquivos ".service"
  • o sufixo (109) tem sufixo ".mount", ".path", ".slice", ".socket", ".target"

Suponha que você tenha verificado nomes de serviço que correspondam a pacotes, conforme sugerido:

  • Uma dúzia de nomes do serviço inclui caracteres que não seriam usados em um nome de pacote, por exemplo, '@' e '.' . Apenas o mesmo, procure a lista de todos os serviços.
  • Demora um pouco (cerca de 5 minutos para processar toda a lista) e não corresponde a nada para 220 da lista (20% de sucesso).
  • Muitas das correspondências são coincidentes, com vários pacotes sendo encontrados (contabilize isso como outra falha de 70%).
  • No geral, essa é uma taxa de sucesso de 5%.

Por outro lado, processar a lista usando o método rpm -qf leva cerca de 30 segundos com 100% de sucesso.

    
por 22.03.2016 / 21:09
0

Estou confiante de que minha pergunta inicial não forneceu as especificações nos detalhes que você precisava e que suas soluções fornecidas funcionariam - mas elas fazem parte do meu caso nily.

No entanto, você me trouxe no caminho certo (para mim) e o seguinte faz o que eu preciso - tenho certeza que existem abordagens melhores, mas pelo menos está funcionando e eu entendo o que está acontecendo:)

Obrigado pelo seu apoio sobre isso.

PACKAGE="mariadb-server httpd"
SERVICE="mariadb httpd"

for f in $PACKAGE
do
  if ! rpm -qa \| grep -qw ${f}
  then
    yum -y install ${f}
  fi
done

for f in $SERVICE
do
  if [ "systemctl is-active ${f}" != "active" ]
  then
    systemctl enable ${f}
    systemctl start ${f}
  fi
done
    
por 23.03.2016 / 10:43

Tags