Systemd: reinicie todas as instâncias de um serviço instanciado de uma só vez

17

Eu uso o bom recurso do systemd: Serviços Instanciados.

Existe uma maneira simples de recarregar todos os serviços instanciados com uma chamada?

Exemplo: não quero executar tudo assim:

systemctl restart autossh@foo
systemctl restart autossh@bar
systemctl restart autossh@blu

Eu tentei isso, mas isso não funciona

systemctl restart autossh@*

Relacionado: Inicie N processos com um arquivo de serviço systemd

Atualizar

Primeiro fiquei fascinado com os Serviços Instantiados, mas depois percebi que executar uma ferramenta de gerenciamento de configuração como Ansible faz mais sentido. Aprendi: mantenha as ferramentas simples. Muitas ferramentas começam a implementar a verificação de condições (se .. mais ...) e loops. Por exemplo, servidores da web ou configuração do servidor de correio. Mas isso deve ser resolvido em um nível diferente (superior): gerenciamento de configuração. Consulte: https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

guettli
fonte

Respostas:

23

O Systemd (a partir do systemd-209) suporta caracteres curinga, no entanto, seu shell provavelmente está tentando expandi-los. Use aspas para passar curingas para o comando systemctl / service literalmente:

systemctl restart 'autossh@*'
weirdan
fonte
Não funciona para mim: systemctl status 'autossh@*'saída: autossh@\x2a.service - ... Active: inactive (dead)Versão:systemd 195
guettli
2
Englobamento está disponível à partir systemd 209: lists.freedesktop.org/archives/systemd-devel/2014-February/...
weirdan
Se você tiver muitos serviços para reiniciar, o loop while na resposta de guettli funcionará melhor, pois o curinga parece tentar reiniciá-los todos de uma vez. Testado com serviços de ~ 1000 php-fpm, a carga subiu para 400 e tive que reiniciar o servidor.
boutch55555
1
Funciona se os processos já estiverem em execução, mas não se eles precisarem ser iniciados pela primeira vez após serem ativados. Mas você pode usar systemctl restart autossh@{1..2}(com qualquer N em vez de 2) que é um pouco menos geral, mas também iniciará os processos, se forem inactive (dead).
Giorgiosironi
7

Não é legal, mas isso funciona para sistemas com um systemd antigo:

systemctl list-units -t service --full| cut -d' ' -f1| grep mypattern | while read s; do systemctl restart $s; done

Obviamente, a solução da resposta acima ( systemctl restart 'autossh@*') é melhor.

guettli
fonte
Cuidado: cutpode analisar o campo errado, caso haja falha nos serviços na saída das unidades de lista.
Juuso Ohtonen
5

@weirdan A resposta está correta, mas falta algo para determinadas distribuições.

Para o Centos 7 e similares , você pode fazer:

systemctl (start|stop|restart|status) my-service@*

MAS, (start) funcionará SOMENTE, se você especificar o sinalizador "--all":

systemctl (start) my-service@* --all

Caso contrário, ele não encontrará os serviços, pois eles não existem. Esse é o recurso pretendido pelo sistema.

Para sistemas baseados no Ubuntu , funciona da mesma maneira, mas a diferença é que o sinalizador "--all" deve ser especificado para todos os argumentos do systemctl, caso contrário, não fará nada.

systemctl (start|stop|restart|status) 'my-service@*' --all
ku4eto
fonte
2

Não sei se existe uma opção para um curinga no terminal para systemd. O que você pode fazer é adicionar um em seus scripts systemd.

O% que eu faria o truque, acho, mas está relacionado à maneira como você roteirizou os serviços instanciados.

Você pode encontrar uma explicação aqui referida como especificadores

o que mostra que:

% n

nome completo da unidade

% p

Para unidades instanciadas, isso se refere à cadeia antes do caractere "@" do nome da unidade. Para unidades não instanciadas, refere-se ao nome da unidade com o sufixo do tipo removido.

%Eu

Para unidades instanciadas: esta é a sequência entre o caractere "@" e o sufixo do nome da unidade.nome da unidade

Não estou respondendo diretamente à sua pergunta, mas pelo que acho que você está tentando alcançar. Se você acha que sua solução pode ser encontrada seguindo essa idéia, compartilhe seu script systemd, para que possamos ilustrar com exemplos e talvez até fornecer o script final.

Se você se sentir confiante em editar seu próprio script para chegar a uma solução dessa maneira, aqui está um exemplo (não vou citá-lo, pois não sei se é relevante para a solução e é muito específico para o que estou propondo)

ignora
fonte