Meu problema:
Estou escrevendo um script bash e nele gostaria de verificar se um determinado serviço está sendo executado.
Eu sei como fazer isso manualmente, com $ service [service_name] status
.
Mas (especialmente desde a mudança para o systemd), que imprime um monte de texto que é um pouco complicado de analisar. Eu assumi que há um comando feito para scripts com saída simples ou um valor de retorno que posso verificar.
Mas pesquisar no Google produz apenas uma tonelada de resultados "Ah, apenas ps aux | grep -v grep | grep [service_name]
". Essa não pode ser a melhor prática, é? E se outra instância desse comando estiver em execução, mas não uma iniciada pelo script init do SysV?
Ou devo calar a boca e sujar as mãos com um pouco de pgrep?
fonte
inactive
ouactivating
e ambossystemctl status
esystemctl is-active
saem com 3. (a partir de systemd-241 ) Solução alternativa:systemctl show service | grep -qx ActiveStatus=activating
foo
faz algo no sistema que envolve a reinicialização e usa um serviço único, por exemplo,foo_cleanup
na próxima inicialização para limpar as coisas. Estou testando isso (meu script também está agendado como um serviço) e quero coletar erros depois, mas quando será depois (música vsauce)? Bem, um dos critérios é quefoo_cleanup
terminou ("deixou de ser ativo").systemctl
possui um modo adequado para scripts; use emshow
vez destatus
e adicione as opções-p
/--properties
e--value
para obter apenas a saída desejada.Aqui está um exemplo (de um sistema Ubuntu 17.04):
Correr (ou não) é um
SubState
. Se você deseja saber se um serviço está ativo, use a propriedadeActiveState
Notas do
man
:fonte
--version
opção com systemctl.Como complemento à resposta de Zanna, a
--value
opção forsystemctl show
foi introduzida na versão 230 do systemd . Portanto, pode não estar disponível em certas distros como o debian jessie.Nesse caso, pode-se emular a opção usando sed:
fonte
Acho isso útil para execução de linha de comando ou se você estiver criando scripts.
Copiado de @StephenKitt
Isso verificará se o serviço está inoperante e executará a reinicialização do serviço
a
||
não verifica se o valor de retorno de systemctl é diferente de zero significado se não é ativo como explica o autor.fonte
Estou muito atrasado para a festa, no entanto, usar systemctl is-active junto com
&&
e||
para isso no script não será o caso o tempo todo. A seguir, usei o tomcat, mas posso usá-lo no método usando argumentos e passando o nome do serviço como argumentos se você precisar verificar vários serviços, mas está fora do escopo aqui.Foi assim que fiz uso ... Apenas compartilhando o meu.
e pela simplicidade e facilidade dos itens, siga os outros explicados aqui:
fonte
if systemctl is-active --quiet tomcat.service
? Além disso,[[
não é um shell padrão.&&
e||
.Em vez de usar o comando sed como na resposta do Oxmel, basta usar
cut -d'=' -f 2
para todos os tipos de propriedades consultadas:por exemplo:
fonte
Acabei de encontrar este ótimo pequeno script:
Fonte
fonte