Jak ustalić status zadania upstart w skrypcie bash?

10

Jak ustalić, czy zadanie upstart działa w skrypcie Bash? To znaczy potrzebuję wartości „boolowskiej”, aby zrobić coś takiego:

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

Odpowiedzi:

9

Utwórz własną funkcję Bash i umieść ją w ~/.bashrc:

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

Naprawdę nie podoba mi się sposób analizowania danych wyjściowych, ale nie widzę innego oczywistego sposobu. I w tym przypadku wynik <service name> startjest bardzo niezawodny, ponieważ jest określony w dokumentacji Upstart .

Teraz możesz użyć tego w następujący sposób:

if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi
gertvdijk
źródło
2
Możesz to zmienić, status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/nullaby upewnić się, że jest cicho.
David G
1

Zwykle używasz pliku PID, ale możesz także użyć pgrep do sprawdzenia swoich procesów. Załóżmy, że twoja usługa się nazywa, jobXto zadziała:

if [ $(pgrep jobX) ]; then

A nawet lepiej

if pgrep jobX > /dev/null 2>&1
Rinzwind
źródło
1

Na podstawie String zawiera w bash :

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

Moim pierwszym impulsem było użycie dostarczonej odmiany kodu 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

co zwróci coś w stylu

metoda return sender =: 1.0 -> dest =: 1.94 odpowiedz_serial = ciąg 2 wariantów „działa”

i użyj powyższego rozwiązania, aby sprawdzić, czy zwrócony ciąg zawiera „uruchomione”. Jednak w przypadku, gdy zadanie nie działa, połączenie dbus zakończy działanie ze statusem 1, zwracając „czekanie”, tak jak się spodziewałem.

status ${job} nigdy nie wyjdzie ze statusem 1, z wyjątkiem przypadku, gdy nie ma takiej pracy.

Goran Miskovic
źródło
1
Odmiana ... isRunning = $ (status $ {job} | grep running | wc -l) zwróci 1, jeśli jest uruchomiony i 0, jeśli nie jest.
Naraen
0

Używałbyś DBUS do zapytania o status tej konkretnej usługi.

$ 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

Pamiętaj, że jeśli piszesz własne zadanie upstart, powinieneś użyć zdarzeń upstart lub zależności pakietu.

ImaginaryRobots
źródło
Wygląda na to, że po prostu wydrukowałby jakiś status tekstowy, który musiałbyś następnie przeanalizować, aby uzyskać wartość logiczną, prawda?
laslowh
0

Wygląda na to, że polecenie statusu upstart jest zgodne ze specyfikacją skryptu inicjującego z projektu Linux Standard Base, co oznacza, że ​​można założyć, że kod zakończenia 0 oznacza, że ​​program działa, kod wyjścia 1-3 oznacza, że ​​jest uruchomiony, i dowolny inny kod wyjścia oznacza niezdefiniowany status.

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

Scott Buchanan
źródło