Eu finalmente consegui que funcionasse, depois de várias tentativas.
Primeira tentativa
Depois de procurar na ajuda do systemctl, encontrei o comando is-active
:
$ systemctl is-active trafficserver
active
Por isso, escrevi um script de shell para aguardar até que o serviço se torne ativo:
while true; do
if [ $(systemctl is-active trafficserver) == "active" ]; then
break
fi
sleep 1
done
Infelizmente, mesmo que esse script funcione como esperado ao testá-lo com start / stop, eu ainda estava recebendo o mesmo erro ao executar os comandos traffic_line
logo após. Eu acho que o serviço é relatado como ativo antes dos processos reais terem sido totalmente iniciados (provavelmente uma questão de milissegundos).
Segunda tentativa
Então eu tentei de outra maneira. Sabendo que este é o primeiro início do serviço, posso esperar até que o arquivo PID do gerenciador do trafficserver exista. Aqui está o que eu tentei:
while [ ! -f /run/trafficserver/manager.lock ]; do
sleep 1
done
O mesmo problema: quando o arquivo PID do gerente do trafficserver é gravado, o gerente não está pronto para receber pedidos ainda, então ainda estou recebendo o erro .
Porra, eu não quero usar um cego sleep
.
Terceira tentativa
Então acabei verificando se o comando traffic_line
em si não falha:
while ! traffic_line --status &> /dev/null; do
sleep 1
done
E isso funciona!
Bom, mas ...
Infelizmente, a resposta é muito específica para o serviço que estou usando (trafficserver) e não se aplica diretamente a outros serviços.
Se você souber uma resposta mais genérica para essa pergunta, sinta-se à vontade para compartilhá-la.