Como determinar o status do trabalho inicial no script bash?


10

Como você determina se um trabalho inicial está sendo executado dentro de um script Bash? Ou seja, preciso de um valor "booleano" para fazer 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

Respostas:


9

Crie sua própria função Bash e coloque-a em ~/.bashrc:

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

Realmente não gosto da maneira de analisar a saída, mas não vejo outra maneira óbvia. E, nesse caso, a saída de <service name> starté muito confiável, conforme especificado na documentação do Upstart .

Agora você pode usá-lo assim:

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

2
Você pode alterar isso status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/nullapenas para garantir que esteja silencioso.
David G

1

Normalmente você usa um arquivo PID, mas também pode usar o pgrep para verificar seus processos. Suponha que seu serviço seja chamado jobXassim:

if [ $(pgrep jobX) ]; then

Ou melhor ainda

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

1

Baseado em String contém no bash :

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

Meu primeiro impulso foi usar a variação do código que ImaginaryRobots forneceu

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 retornaria algo como

método return remetente =: 1.0 -> dest =: 1.94 reply_serial = cadeia de caracteres 2 variante "running"

e use a solução acima para verificar se a string retornada contém "running". No entanto, caso esse trabalho não esteja em execução, a chamada do dbus sairá com o status 1, retornando "em espera", como eu esperava.

status ${job} nunca sairia com o status 1, exceto no caso em que não houver esse trabalho.


1
Uma variação ... isRunning = $ (status $ {job} | grep running | wc -l) retornará 1 se estiver em execução e 0 se não estiver.
Naraen 26/04

0

Você usaria o DBUS para consultar o status desse serviço específico.

$ 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

Observe que, se você estiver escrevendo seu próprio trabalho de inicialização, use eventos de inicialização ou dependências de pacotes.


Parece que isso imprimiria algum tipo de status de texto que você precisaria analisar para obter um valor booleano, certo?
laslowh

0

Parece que o comando upstart status está em conformidade com a especificação do script init do projeto Linux Standard Base, o que significa que você pode assumir um código de saída 0 significa que o programa está em execução, um código de saída 1-3 significa que está em execução e qualquer outro código de saída significa um status indefinido.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.