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
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
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.
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
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.
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