Eu tenho uma máquina executando a hierarquia cgroups v2 (unificada), então o systemd é responsável por gerenciar todos os cgroups e a delegação para a instância do usuário systemd funciona. Eu gostaria de realizar o controle de recursos em um grupo de processos, então preciso deles juntos em uma unidade — presumivelmente um escopo systemd .
Normalmente, systemd-run
faria isso - mas infelizmente esses processos já estão em execução e não quero reiniciá-los.
Como posso criar um escopo do systemd a partir de processos já existentes? A documentação da Interface do Grupo de Controle me diz que é possível, mas não consegui encontrar uma maneira pela linha de comando. Nem systemctl
nem systemd-run
parecem capazes de fazer isso.
Existe uma maneira a partir da linha de comando? Estou executando o systemd v241 se for importante.
Existem várias ferramentas de linha de comando para fazer chamadas dbus; systemd vem com um chamado
busctl
. Então você pode chamarStartTransientUnit
a partir da linha de comando.O comando
A sintaxe é positivamente irritante, mas se parece com isso (para um ID de processo, 14460):
Explicação
Isso é positivamente opaco (e levou algumas tentativas para acertar e, finalmente, usando
dbus-monitor
para ver comosystemd-run
fez isso - apenas no gerenciador de sistema, porém,systemd-run --user
parece não passar pelo dbus). Então uma explicação, parâmetro por parâmetro:Adicionando ao comando
Mais propriedades
Para adicionar outra propriedade systemd à unidade, você deve aumentar o número de propriedades e adicioná-la. Observe que cada propriedade tem pelo menos três argumentos de linha de comando adicionais: a chave, o tipo de valor e o valor. Por exemplo, adicionar uma propriedade Slice passaria de:
para
O tipo "s" é string. A lista deles pode ser encontrada no capítulo “Sistema de tipo” da especificação D-Bus
É claro que você pode alterar a contagem para 3 e adicionar uma terceira propriedade. etc.
Mais pids
Semelhante a mais propriedades, mas desta vez é a contagem enterrada dentro do valor da propriedade "PIDs". Um exemplo deve deixar mais claro:
torna-se
se você adicionar PID 14461 e 14460.
Você pode adicionar um terceiro, quarto, etc. PID da mesma maneira.
Combinando-os
É claro que você pode combinar propriedades adicionais com pids adicionais. Apenas lembre-se de que a lista de pids é um valor de propriedade, portanto, ela precisa permanecer junta. Você não pode misturar argumentos pid com outras propriedades. O jeito certo é mudar:
para:
(a ordem não importa, você pode colocar o bloco Slice antes do bloco PIDs).
De onde vem a assinatura?
A assinatura é obtida da documentação da API do systemd dbus ou, provavelmente mais facilmente, usando a introspecção do dbus:
(para
grep1
, consulte https://unix.stackexchange.com/a/279518 )Existem muitos métodos e propriedades dbus listados, mais de 180 aqui. Então não omita o
grep
.O que significa "falhar" lidar com conflitos? O que mais está lá?
De acordo com a documentação do systemd (procure em "CreateUnit"), os valores úteis são
fail
ereplace
.fail
significa que seu escopo não será iniciado se houver algum conflito.replace
significa que o systemd se livrará da unidade conflitante. Observe que isso parece ser apenas para unidades que estão iniciando ou agendadas para (ele diz "enfileirado") - substituir não substituirá, por exemplo, um escopo já em execução com o mesmo nome.