it-swarm.com.de

Überprüfen Sie, ob ein Service in bash (CentOS und Ubuntu) vorhanden ist.

Was ist der beste Weg in bash zu überprüfen, ob ein Dienst installiert ist? Es sollte für Red Hat (CentOS) und Ubuntu funktionieren?

Denken:

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

Könnte auch den Befehl service verwenden und den Rückkehrcode überprüfen.

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

Was ist die beste Lösung?

15
Justin

Rustam Mamat erhält dafür die Ehre:

Wenn Sie alle Ihre Dienste auflisten, können Sie die Ergebnisse anzeigen, um zu sehen, was dort enthalten ist. Z.B.:

# 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

Um die Antwort von Joel B aufzubauen, handelt es sich hier um eine Funktion (mit etwas mehr Flexibilität. Beachten Sie das völlige Fehlen der Parameterprüfung; dies wird brechen, wenn Sie nicht zwei Parameter übergeben):

#!/bin/sh

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

serviceCommand Apache2 status
2
Cody S

Nach dem Lesen einiger systemd Manpages ...

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

... und systemd.services (5) ....

... und ein netter kleiner Artikel ...

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

Ich glaube, das könnte eine Antwort sein.

systemctl list-unit-files -type service

Rufen Sie awk {'print $ 1'} auf, um eine Auflistung der Serviceeinheiten zu erhalten.

Rufen Sie awk erneut auf, um ausschließlich die Dienstnamen abzurufen. Ändern Sie das Feldtrennzeichen mit -F auf den Punkt.

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

Durch Variation und Erweiterung der Basislösung können Sie den Status der Dienste Ihres Systems ermitteln, indem Sie eine for -Schleife mit systemctl is-active $service.

1

Das Problem mit service --status-all aus den Antworten von oben ist, dass es scheint, dass es jeden Dienst pingt, was ziemlich lang sein kann.

Wie wäre es mit:

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

Dies wird bei der Bash-Fertigstellung verwendet (in der Datei/usr/share/bash-completion/bash_completion nach _services suchen):

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

Hoffe zu helfen.

0
jehon