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

8

Eu uso o bom recurso do systemd: Instantiated Services.

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@*

Relacionados: Iniciar N processos com um arquivo de serviço systemd

    
por guettli 05.11.2015 / 11:55

4 respostas

13

O Systemd (a partir do systemd-209) suporta curingas, mas é provável que seu shell tente expandi-los. Use aspas para passar curingas para o comando systemctl / service verbatim:

systemctl restart 'autossh@*'
    
por 19.08.2016 / 17:05
7

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

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

É claro que a solução acima da resposta ( systemctl restart 'autossh@*' ) é melhor.

    
por 09.11.2015 / 20:22
1

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

O% i faria o truque, mas está relacionado à forma como você criou os serviços instanciados.

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

que mostra que:

%n

full unit name

%p

For instantiated units, this refers to the string before the "@" character of the unit name. For non-instantiated units, this refers to the name of the unit with the type suffix removed.

%i

For instantiated units: this is the string between the "@" character and the suffix of the unit name.unit name

Eu não estou respondendo diretamente a sua pergunta, mas pelo que eu acho que você está tentando alcançar. Se você acha que sua solução pode ser encontrada seguindo essa ideia, por favor, compartilhe seu script systemd, para que possamos, eventualmente, ilustrar com exemplos e talvez até mesmo fornecer-lhe o script final.

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

    
por 09.11.2015 / 15:14
1

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

Para Centos 7 e similares , você pode fazer:

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

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

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

Caso contrário, não encontrará os serviços, uma vez que eles não existem. Este é o recurso pretendido pelo sistema.

Para sistemas baseados em Ubuntu , funciona praticamente da mesma maneira, mas a diferença é que o sinalizador "--all" deve ser especificado para todos os argumentos systemctl, caso contrário não será faça qualquer coisa.

systemctl (start|stop|restart|status) 'my-service@*' --all
    
por 07.06.2018 / 16:17

Tags