web-dev-qa-db-fra.com

Vérifier si le service existe en bash (CentOS et Ubuntu)

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?

15
Justin

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
10
Joel B
#!/bin/sh

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

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
2
Cody S

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.

0
jehon