Проверьте, существует ли служба в 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