AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 525740
Accepted
derobert
derobert
Asked: 2019-06-19 15:53:21 +0800 CST2019-06-19 15:53:21 +0800 CST 2019-06-19 15:53:21 +0800 CST

Como crio um escopo do systemd para um processo já existente na linha de comando?

  • 772

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-runfaria 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 systemctlnem systemd-runparecem capazes de fazer isso.

Existe uma maneira a partir da linha de comando? Estou executando o systemd v241 se for importante.

linux systemd
  • 1 1 respostas
  • 1706 Views

1 respostas

  • Voted
  1. Best Answer
    derobert
    2019-06-19T15:53:21+08:002019-06-19T15:53:21+08:00

    Existem várias ferramentas de linha de comando para fazer chamadas dbus; systemd vem com um chamado busctl. Então você pode chamar StartTransientUnita partir da linha de comando.

    O comando

    A sintaxe é positivamente irritante, mas se parece com isso (para um ID de processo, 14460):

    busctl call --user org.freedesktop.systemd1 /org/freedesktop/systemd1 \
           org.freedesktop.systemd1.Manager StartTransientUnit 'ssa(sv)a(sa(sv))' \
           'SCOPE-NAME.scope' fail 1 PIDs au 1 14460 0
    

    Explicação

    Isso é positivamente opaco (e levou algumas tentativas para acertar e, finalmente, usando dbus-monitorpara ver como systemd-runfez isso - apenas no gerenciador de sistema, porém, systemd-run --userparece não passar pelo dbus). Então uma explicação, parâmetro por parâmetro:

    busctl call --user                  # use user session dbus, not system   
      org.freedesktop.systemd1          # dbus service name
      /org/freedesktop/systemd1         # dbus object in that service
      org.freedesktop.systemd1.Manager  # interface name in that service 
      StartTransientUnit                # method we're going to call
      'ssa(sv)a(sa(sv))'                # signature of method, see below
      'SCOPE-NAME.scope'                # first argument, name of scope
      fail                              # second argument, how to handle conflicts (see below)
      1                                 # start of third argument, number of systemd properties for unit 
      PIDs                              # name of first property
      au                                # data type of first property, (a)rray [aka list] of (u)nsigned integers
      1                                 # count of array — that is, number of pids 
      14460                             # first pid
      0                                 # fourth argument: array size=0 (unused parameter)
    

    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:

    … fail 1 PIDs au 1 14460 0
    

    para

    … fail 2 PIDs au 1 14460 Slice s whatever.slice 0
           ^                 ^^^^^ ^ ^^^^^^^^^^^^^^
         count                key type value
    

    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:

    … fail 1 PIDs au 1 14460 0
    

    torna-se

    … fail 1 PIDs au 2 14460 14461 0
                     ^       ^^^^^
             internal count  second pid
    

    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:

    … fail 1 PIDs au 1 14460 0
    

    para:

    … fail 2 PIDs au 2 14460 14461 Slice s whatever.slice 0
    

    (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:

    $ busctl introspect org.freedesktop.systemd1 /org/freedesktop/systemd1 \
             org.freedesktop.systemd1.Manager | grep1 StartTransientUnit
    NAME                  TYPE     SIGNATURE         RESULT/VALUE   FLAGS
    .StartTransientUnit   method   ssa(sv)a(sa(sv))  o              -
    

    (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 faile replace. failsignifica que seu escopo não será iniciado se houver algum conflito. replacesignifica 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.

    • 11

relate perguntas

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve