Проверьте, существует ли служба в bash (CentOS и Ubuntu)

Каков наилучший способ в bash проверить, установлена ​​ли служба? Он должен работать как с Red Hat (CentOS), так и с Ubuntu?

Мышление:

service="mysqld"
if [ -f "/etc/init.d/$service" ]; then
    # mysqld service exists
fi

Также можно использовать команду service и проверить код возврата.

service mysqld status
if [ $? = 0 ]; then
    # mysqld service exists
fi

Какое наилучшее решение?

Ответ 1

Рустам Мамат получает за это кредит:

Если вы перечислите все свои услуги, вы можете просмотреть результаты, чтобы увидеть, что там. Например:.

# Restart apache2 service, if it exists.    
if service --status-all | grep -Fq 'apache2'; then    
  sudo service apache2 restart    
fi

Ответ 2

Проблема с service --status-all из вышеперечисленных ответов заключается в том, что кажется, что ping каждую услугу, которая может быть довольно длинной.

Как насчет:

systemctl list-units --full -all | grep -Fq "$SERVICENAME.service"

Это то, что используется в завершении bash (в файле /usr/share/bash-completion/bash_completion, ищите _services):

COMPREPLY+=( $( systemctl list-units --full --all 2>/dev/null | \
   awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }' ) )

Надеюсь помочь.

Ответ 3

Чтобы скомпоновать ответ Joel B, здесь это как функция (добавив немного гибкости. Обратите внимание на полное отсутствие проверки параметров, это сломается, если вы не пройдете в 2 параметра):

#!/bin/sh

serviceCommand() {
  if sudo service --status-all | grep -Fq ${1}; then
    sudo service ${1} ${2}
  fi
}

serviceCommand apache2 status

Ответ 4

#!/bin/sh

service=mysql
status=$(/etc/init.d/mysql status)
print "$status"
#echo $status > /var/log/mysql_status_log

Ответ 5

После прочтения некоторых системных страниц man...

https://www.freedesktop.org/software/systemd/man/systemd.unit.html

... и systemd.services(5)....

... и хорошая маленькая статья...

https://www.linux.com/learn/understanding-and-using-systemd

Я считаю, что это может быть ответом.

systemctl list-unit-Files -type service

Отправьте awk {'print $ 1'}, чтобы получить список сервисных единиц

Передайте awk снова, чтобы получить исключительно имена сервисов. Измените разделитель полей на период с -F.

awk -F. print {'print $ 1'}

systemctl is-active $service базовое решение, вы можете определять состояние системных служб, комбинируя цикл for с systemctl is-active $service.

Ответ 6

Попробуйте это, так как команда ps может использоваться как в Ubuntu, так и в RHEL, это должно работать на обеих платформах.

#!/bin/bash
ps cax | grep mysqld > /dev/null
if [ $? -eq 0 ]; then
  echo "mysqld service exists"
else
  echo "mysqld service not exists"
fi