Tente isto:
for f in $SERVICE; do if ! rpm -qa \| grep -qw $f; then ... fi; done
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
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
systemctl list-unit-files
Suponha que você tenha verificado nomes de serviço que correspondam a pacotes, conforme sugerido:
'@'
e '.'
. Apenas o mesmo, procure a lista de todos os serviços. Por outro lado, processar a lista usando o método rpm -qf
leva cerca de 30 segundos com 100% de sucesso.
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