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
Laslowh
fonte

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
gertvdijk
fonte
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
Rinzwind
fonte
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.

Goran Miskovic
fonte
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.

ImaginaryRobots
fonte
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

Scott Buchanan
fonte