Come determinare lo stato del lavoro upstart nello script bash?


10

Come si determina se un processo di avvio è in esecuzione all'interno di uno script Bash? Cioè ho bisogno di un valore "booleano" per fare qualcosa del tipo:

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

Risposte:


9

Crea la tua funzione Bash e inseriscila nel tuo ~/.bashrc:

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

Non mi piace molto il modo di analizzare l'output, ma non vedo un altro modo ovvio. E in questo caso l'output di <service name> startè molto affidabile come specificato nella documentazione di Upstart .

Ora puoi usarlo in questo modo:

if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi

2
Potresti voler modificare questo status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/nullsolo per assicurarti che sia silenzioso.
David G,

1

Normalmente usi un file PID ma puoi anche usare pgrep per controllare i tuoi processi. Supponiamo che il tuo servizio sia chiamato jobXquesto funzionerà:

if [ $(pgrep jobX) ]; then

O ancora meglio

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

1

Basato su String contiene 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

Il mio primo impulso è stato quello di utilizzare la variazione del codice ImaginaryRobots fornito

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

che restituirebbe qualcosa del genere

metodo return mittente =: 1.0 -> dest =: 1.94 reply_serial = 2 stringa variante "in esecuzione"

e utilizzare la soluzione sopra per verificare se la stringa restituita contiene "in esecuzione". Tuttavia, nel caso in cui il lavoro non sia in esecuzione, la chiamata dbus uscirà con lo stato 1 invece di restituire "attesa" come mi aspettavo.

status ${job} non uscirebbe mai con lo stato 1 se non nel caso in cui tale lavoro non sia presente.


1
Una variante ... isRunning = $ (status $ {job} | grep running | wc -l) restituirà 1 se è in esecuzione e 0 se non lo è.
Naraen,

0

Si utilizzerà DBUS per interrogare lo stato di quel particolare servizio.

$ 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

Nota che se stai scrivendo il tuo lavoro upstart, dovresti invece usare eventi upstart o dipendenze di pacchetti.


Sembra che questo stamperebbe semplicemente una sorta di stato del testo che dovresti quindi analizzare per ottenere un valore booleano, giusto?
laslowh,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.