Wie kann man den Status des Upstart-Jobs im Bash-Skript ermitteln?

10

Wie stellen Sie fest, ob ein Startjob in einem Bash-Skript ausgeführt wird? Das heißt, ich brauche einen "booleschen" Wert, um etwas zu tun wie:

#!/bin/bash
if [ determine_if_job_x_is_running ]; then
  echo "I see upstart job X is running, please stop it before ..."
fi
laslowh
quelle

Antworten:

9

Erstellen Sie Ihre eigene Bash-Funktion und fügen Sie diese in Ihre ~/.bashrc:

check_upstart_service(){
    status $1 | grep -q "^$1 start" > /dev/null
    return $?
}

Ich mag es wirklich nicht, die Ausgabe zu analysieren, aber ich sehe keinen anderen offensichtlichen Weg. In diesem Fall ist die Ausgabe von <service name> startsehr zuverlässig, wie in der Upstart-Dokumentation angegeben .

Jetzt können Sie es so verwenden:

if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi
gertvdijk
quelle
2
Möglicherweise möchten Sie dies ändern status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/null, um sicherzustellen, dass es still ist.
David G
1

Normalerweise verwenden Sie eine PID-Datei, aber Sie können auch pgrep verwenden, um Ihre Prozesse zu überprüfen. Angenommen, Ihr Dienst heißt, jobXdies funktioniert:

if [ $(pgrep jobX) ]; then

Oder noch besser

if pgrep jobX > /dev/null 2>&1
Rinzwind
quelle
1

Basierend auf String enthält in bash :

job='your_job_name'
job_status=$(status ${job})
if [[ ${job_status} == *running* ]]
  then
    # do whatever you need
  else
    # do whatever you need
fi

Mein erster Impuls war die Verwendung einer Variation des bereitgestellten Codes ImaginaryRobots

job='your_job_name'
dbus-send --system --print-reply --dest=com.ubuntu.Upstart \
  /com/ubuntu/Upstart/jobs/${job}/_ \
  org.freedesktop.DBus.Properties.Get string:'' string:state

das würde so etwas zurückgeben

Methode return sender =: 1.0 -> dest =: 1.94 reply_serial = 2 Variantenzeichenfolge "running"

und verwenden Sie die obige Lösung, um zu überprüfen, ob die zurückgegebene Zeichenfolge "running" enthält. Wenn der Job jedoch nicht ausgeführt wird, wird der dbus-Aufruf mit dem Status 1 beendet und stattdessen "Warten" zurückgegeben, wie ich es erwartet hatte.

status ${job} würde niemals mit Status 1 beenden, außer in dem Fall, in dem es keinen solchen Job gibt.

Goran Miskovic
quelle
1
Eine Variation ... isRunning = $ (Status $ {job} | grep running | wc -l) gibt 1 zurück, wenn es ausgeführt wird, und 0, wenn es nicht ausgeführt wird.
Naraen
0

Sie würden DBUS verwenden, um den Status dieses bestimmten Dienstes abzufragen.

$ job=myjob
$ dbus-send --system --print-reply --dest=com.ubuntu.Upstart /com/ubuntu/Upstart/jobs/${job}/_ org.freedesktop.DBus.Properties.GetAll string:''

http://upstart.ubuntu.com/cookbook/#get-status-of-job-via-d-bus

Beachten Sie, dass Sie beim Schreiben Ihres eigenen Upstart-Jobs stattdessen Upstart-Ereignisse oder Paketabhängigkeiten verwenden sollten.

ImaginaryRobots
quelle
Scheint so, als würde dies nur eine Art Textstatus drucken, den Sie dann analysieren müssten, um einen booleschen Wert zu erhalten, oder?
Laslowh
0

Es scheint, dass der Befehl upstart status mit der Spezifikation des Init-Skripts aus dem Linux Standard Base-Projekt übereinstimmt. Dies bedeutet, dass Sie annehmen können, dass ein Exit-Code von 0 bedeutet, dass das Programm ausgeführt wird, ein Exit-Code von 1-3 bedeutet, dass es ausgeführt wird, und jeder andere anderer Exit-Code bedeutet einen undefinierten Status.

Siehe: http://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/iniscrptact.html

Scott Buchanan
quelle