Quel est le meilleur moyen dans bash de vérifier si un service est installé? Cela devrait fonctionner à la fois sous Red Hat (CentOS) et Ubuntu?
En pensant:
service="mysqld"
if [ -f "/etc/init.d/$service" ]; then
# mysqld service exists
fi
Pourrait également utiliser la commande service
et vérifier le code de retour.
service mysqld status
if [ $? = 0 ]; then
# mysqld service exists
fi
Quelle est la meilleure solution?
Rustam Mamat obtient le crédit pour cela:
Si vous répertoriez tous vos services, vous pouvez grpper les résultats pour voir ce qu’ils contiennent. Par exemple.:
# Restart Apache2 service, if it exists.
if service --status-all | grep -Fq 'Apache2'; then
Sudo service Apache2 restart
fi
#!/bin/sh
service=mysql
status=$(/etc/init.d/mysql status)
print "$status"
#echo $status > /var/log/mysql_status_log
Pour compléter la réponse de Joel B, la voici comme une fonction (avec un peu de souplesse ajoutée. Notez l'absence totale de vérification des paramètres; cela casserait si vous ne transmettez pas deux paramètres):
#!/bin/sh
serviceCommand() {
if Sudo service --status-all | grep -Fq ${1}; then
Sudo service ${1} ${2}
fi
}
serviceCommand Apache2 status
Le problème avec service --status-all
à partir des réponses ci-dessus est qu'il semble envoyer une requête ping à chaque service, ce qui peut être assez long.
Qu'en est-il de:
systemctl list-units --full -all | grep -Fq "$SERVICENAME.service"
Voici ce qui est utilisé dans la complétion de bash (dans le fichier/usr/share/bash-complétion/bash_completion, recherchez _services):
COMPREPLY+=( $( systemctl list-units --full --all 2>/dev/null | \
awk '$1 ~ /\.service$/ { sub("\\.service$", "", $1); print $1 }' ) )
J'espère aider.