¿Cómo determinar el estado del trabajo inicial en el script bash?

10

¿Cómo se determina si un trabajo inicial se está ejecutando dentro de un script Bash? Es decir, necesito un valor "booleano" para hacer algo como:

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

Respuestas:

9

Crea tu propia función Bash y pon esto en tu ~/.bashrc:

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

Realmente no me gusta la forma de analizar la salida, pero no veo otra forma obvia. Y en este caso, la salida de <service name> startes muy confiable como se especifica en la documentación de Upstart .

Ahora puedes usarlo así:

if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi
gertvdijk
fuente
2
Es posible que desee modificar esto status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/nullsolo para asegurarse de que sea silencioso.
David G
1

Normalmente usa un archivo PID, pero también puede usar pgrep para verificar sus procesos. Suponga que su servicio se llama, jobXesto funcionará:

if [ $(pgrep jobX) ]; then

O mejor

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

Basado en String contiene 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

Mi primer impulso fue usar la variación de código que se proporcionaba 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

que devolvería algo como

método return sender =: 1.0 -> dest =: 1.94 reply_serial = 2 cadena de variantes "en ejecución"

y use la solución anterior para verificar si la cadena devuelta contiene "en ejecución". Sin embargo, en caso de que el trabajo no se esté ejecutando, la llamada dbus saldrá con el estado 1 en su lugar, devolverá "esperando" como esperaba.

status ${job} nunca saldría con el estado 1, excepto en el caso de que no haya tal trabajo.

Goran Miskovic
fuente
1
Una variación ... isRunning = $ (status $ {job} | grep running | wc -l) devolverá 1 si está en ejecución y 0 si no lo está.
Naraen
0

Usaría DBUS para consultar el estado de ese servicio en particular.

$ 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

Tenga en cuenta que si está escribiendo su propio trabajo de inicio, debe usar eventos de inicio o dependencias de paquetes.

Robots imaginarios
fuente
Parece que esto simplemente imprimiría algún tipo de estado de texto que luego tendría que analizar para obtener un valor booleano, ¿verdad?
laslowh
0

Parece que el comando de estado upstart se ajusta a la especificación del script de inicio del proyecto Linux Standard Base, lo que significa que puede asumir que un código de salida de 0 significa que el programa se está ejecutando, un código de salida de 1-3 significa que se está ejecutando y cualquier otro código de salida significa un estado indefinido.

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

Scott Buchanan
fuente