web-dev-qa-db-fra.com

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

Comment déterminez-vous si un travail mis à jour est en cours d'exécution dans 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
10
laslowh

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> start est très fiable car elle est spécifiée dans la documentation Upstart .

Maintenant, vous pouvez l'utiliser comme ceci:

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

Basé sur String contient en 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 variante de code ImaginaryRobots fournie

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 retour expéditeur =: 1.0 -> dest =: 1.94 reply_serial = 2 chaîne de caractères "en cours d'exécution"

et utilisez la solution ci-dessus pour vérifier si la chaîne renvoyée contient "en cours d'exécution". Toutefois, si ce travail n’exécute pas, l’appel dbus se termine avec l’état 1 et renvoie "en attente" comme je l’attendais.

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

1
Goran Miskovic

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

if [ $(pgrep jobX) ]; then

Ou même mieux

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

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 travail upstart, vous devez utiliser plutôt des événements upstart ou des dépendances de package.

0
ImaginaryRobots

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. autre code de sortie signifie un statut indéfini.

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

0
Scott Buchanan