A sequência a seguir me dá o valor de retorno do primeiro comando, não o segundo como eu esperava (não importa se eu executar 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á rodando. O seguinte comando, executado de forma autônoma, me fornece um valor de retorno correto 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 ligado 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 preciso tê-lo como um one-liner, pois estou colocando na shell_exec()
função PHP. E executar duas vezes shell_exec()
tem o mesmo resultado que colocar os comandos em uma linha.
Quando me deparo com um problema como esse, tendo a seguir o mantra de Sherlock Holmes e considerar o que resta, por mais implausível que seja, uma vez que o impossível é eliminado. É claro que com os computadores nada é impossível, porém 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 $?
— o valor de retorno não está correto, por quê?”)Neste caso, se
mostra que
$?
é 0, isso significa quesystemctl is-active
realmente indicou sucesso. O fato de um separadosystemctl is-active
mostrar que o serviço não está ativo sugere fortemente que há uma corrida entre o serviço e o operador humano digitando os comandos; basicamente, que o serviço inicia, o suficiente parasystemctl start
terminar esystemctl is-active
executar e encontrar o serviço ativo, mas o serviço falha, então um humano inseridosystemctl is-active
o considera inativo.Adicionar um pequeno atraso entre
systemctl start
esystemctl is-active
deve evitar o falso positivo.O Systemd ativa o serviço por um curto período de tempo (
0.1
segundos) e, em seguida, o serviço trava.Retorna
3
como deveria ser;Menos de
0.2
segundos, ele retorna0
como não deveria ser:Além disso, se eu
systemctl start x; ps -fA | grep -i x
vejo o serviço. Se eu correr deps
novo depois disso, acabou.Tente isto:
&&
Isso forçará o sistema a executar os comandos em ordem e somente se o comando anterior for concluído com êxito .