Comment déterminer le statut du travail parvenu dans le script bash?

10

Comment déterminez-vous si un travail parvenu est en cours d'exécution à l'intérieur d'un script Bash? C'est-à-dire que j'ai besoin d'une valeur "booléenne" pour faire quelque chose comme:

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

Réponses:

9

Créez votre propre fonction Bash et mettez-la dans votre ~/.bashrc:

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

Je n'aime vraiment pas la façon d'analyser la sortie, mais je ne vois pas d'autre moyen évident. Et dans ce cas, la sortie de <service name> startest très fiable comme spécifié dans la documentation Upstart .

Vous pouvez maintenant l'utiliser comme ceci:

if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi
gertvdijk
la source
2
Vous voudrez peut-être modifier cela status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/nullpour vous assurer qu'il est silencieux.
David G
1

Normalement, vous utilisez un fichier PID mais vous pouvez également utiliser pgrep pour vérifier vos processus. Supposons que votre service s'appelle, jobXcela fonctionnera:

if [ $(pgrep jobX) ]; then

Ou encore mieux

if pgrep jobX > /dev/null 2>&1
Rinzwind
la source
1

Basé sur String contient dans bash :

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

Ma première impulsion a été d'utiliser la variation de code ImaginaryRobots fourni

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

qui retournerait quelque chose comme

méthode return sender =: 1.0 -> dest =: 1.94 reply_serial = 2 chaîne de variante "en cours d'exécution"

et utilisez la solution ci-dessus pour vérifier si la chaîne renvoyée contient "running". Cependant, si ce travail n'est pas en cours d'exécution, l'appel dbus se terminera avec le statut 1 au lieu de retourner "en attente" comme je l'attendais.

status ${job} ne quitterait jamais avec le statut 1, sauf dans le cas où il n'y a pas un tel travail.

Goran Miskovic
la source
1
Une variation ... isRunning = $ (status $ {job} | grep running | wc -l) renverra 1 s'il est en cours d'exécution et 0 s'il ne l'est pas.
Naraen
0

Vous utiliseriez DBUS pour interroger le statut de ce service particulier.

$ 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

Notez que si vous écrivez votre propre tâche upstart, vous devez utiliser des événements upstart ou des dépendances de package à la place.

ImaginaryRobots
la source
On dirait que cela ne ferait qu'imprimer une sorte d'état de texte que vous auriez ensuite à analyser pour obtenir une valeur booléenne, non?
laslowh
0

Il semble que la commande upstart status soit conforme à la spécification de script init du projet Linux Standard Base, ce qui signifie que vous pouvez supposer qu'un code de sortie de 0 signifie que le programme est en cours d'exécution, un code de sortie de 1-3 signifie qu'il est en cours d'exécution, et tout autre code de sortie signifie un statut indéfini.

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

Scott Buchanan
la source