Por que o status de saída é diferente ao executar 'systemctl start; systemctl está ativo 'e' systemctl está ativo 'separadamente?

6

A seguinte sequência me dá o valor de retorno do primeiro comando, não o segundo como eu esperava (não importa se eu executo o primeiro comando em um subshell):

sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;
(sudo systemctl start x); sudo systemctl is-active --quiet x; echo $?;

O serviço x está quebrado e não pôde ser iniciado - então ele não está em execução. O comando a seguir, executado independente, fornece um valor de retorno correto de 3 como deveria ser:

sudo systemctl is-active --quiet x; echo $?;

Então, por que estou obtendo o valor de retorno do primeiro comando ( 0 ) ao executar command; command; echo $? em vez do valor de retorno ( 3 ) do segundo com echo $? ?

Estou em GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu) . Eu sei, que se eu dividir em 2 linhas, funciona:

sudo systemctl start x;
sudo systemctl is-active --quiet x; echo $?;

Mas eu preciso tê-lo como um one-liner, já que estou colocando em PHP shell_exec() function. E executar duas vezes shell_exec() tem o mesmo resultado que colocar os comandos em uma linha.

    
por chevallier 27.04.2018 / 12:40

2 respostas

11

Quando me deparo com uma questão como essa, costumo seguir o mantra de Sherlock Holmes e considerar o que resta, por implausível, quando o impossível é eliminado. É claro que com os computadores nada é impossível, no entanto, algumas coisas são tão improváveis que podemos ignorá-las a princípio. (Isso faz mais sentido com o título original, " command; command; echo $? - valor de retorno não está correto, por quê?")

Nesse caso, se

sudo systemctl start x; sudo systemctl is-active --quiet x; echo $?;

mostra que $? é 0, o que significa que systemctl is-active realmente indica sucesso. O fato de um systemctl is-active separado mostrar que o serviço não está ativo sugere strongmente que há uma corrida entre o serviço e o operador humano que digita os comandos. basicamente, que o serviço é iniciado, em uma extensão suficiente para que systemctl start seja concluído e systemctl is-active seja executado e encontre o serviço ativo, mas, em seguida, o serviço falha, portanto, um systemctl is-active inserido pelo usuário o considera inativo. / p>

Adicionar um pequeno intervalo entre systemctl start e systemctl is-active deve evitar o falso positivo.

    
por 27.04.2018 / 15:46
2

O Systemd traz o serviço por um curto período ( 0.1 segundos) e depois o serviço trava.

Retorna 3 como deveria ser;

sudo systemctl start x; sleep 0.2; sudo systemctl is-active --quiet x; echo $?;

Menos que 0.2 segundos, devolve 0 , como não deveria ser:

sudo systemctl start x; sleep 0.1; sudo systemctl is-active --quiet x; echo $?;

Além disso, se eu fizer systemctl start x; ps -fA | grep -i x , vejo o serviço. Se eu rodar ps novamente depois disso, ele desaparecerá.

    
por 27.04.2018 / 13:30