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 / 506347
Accepted
Carl
Carl
Asked: 2019-03-15 11:49:25 +0800 CST2019-03-15 11:49:25 +0800 CST 2019-03-15 11:49:25 +0800 CST

Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target?

  • 772

Eu li o que é multi-user.target e a documentação do systemd , que afirma que o multi-user.target é um destino especial. Além disso, muitos dos exemplos do systemd contêm essa linha.

  1. Por que tantos serviços de exemplo contêm essa linha?
  2. O que aconteceria se eles não contivessem WantedBy=multi-user.target?
  3. Você poderia me dar um exemplo de quando seria realmente aconselhável não incluir essa linha em uma definição de arquivo de serviço?
  4. Na mesma linha, quando é uma boa ideia manter essa linha?
systemd
  • 3 3 respostas
  • 84633 Views

3 respostas

  • Voted
  1. Best Answer
    telcoM
    2019-03-15T14:51:34+08:002019-03-15T14:51:34+08:00

    1.) multi-user.targeté basicamente o equivalente mais próximo do nível de execução 3 clássico do SysVinit systemd. Quando um systemdsistema é inicializado, systemdestá tentando fazer com que o estado do sistema corresponda ao estado especificado por default.target- que geralmente é um alias para graphical.targetou multi-user.target.

    multi-user.targetnormalmente define um estado do sistema onde todos os serviços de rede são iniciados e o sistema aceitará logins, mas uma GUI local não é iniciada. Este é o estado de sistema padrão típico para sistemas de servidor, que podem ser sistemas sem periféricos montados em rack em uma sala de servidores remotos.

    graphical.targeté outro alias possível para default.target. Normalmente é definido como um superconjunto do multi-user.target: inclui tudo o multi-user.targetque faz, mais a ativação de um login de GUI local. Assim como o nível de execução 5 no clássico SysVinit.

    A linha WantedBy=multi-user.targetem um serviço é essencialmente a mesma que especificar "este serviço deve iniciar nos níveis de execução 3, 4 e 5" em sistemas SysVinit: ela informa systemdque este serviço deve ser iniciado como parte da inicialização normal do sistema, seja ou não um local A GUI está ativa.

    No entanto, WantedByé separado do estado ativado/desativado: então, em outro sentido, é uma espécie de "predefinição": determina em que condições o início automático pode ocorrer, mas apenas quando o serviço é ativado em primeiro lugar.

    2.) se você omitir a WantedBy=multi-user.targetlinha e nenhum outro serviço habilitado incluir um Requires=your.serviceou Wants=your.serviceem sua definição de serviço, seu serviço não será iniciado automaticamente.

    systemdfunciona em dependências e, no momento da inicialização, se nada Requiresou Wantsseu serviço, ele não será iniciado, mesmo que o serviço esteja habilitado.

    Claro, você pode editar seu default.targetpara adicionar ou excluir Requiresou Wantslinhas para qualquer serviço que deseja iniciar no momento da inicialização - mas para que você possa simplesmente soltar um novo arquivo de serviço no sistema e fazê-lo funcionar por padrão (o que facilita muito as coisas para o software gerenciadores de pacotes), systemdtem as palavras-chave WantedBye RequiredByque podem ser usadas para inserir Wantse digitar Requiresdependências (respectivamente) do "outro lado".

    3.) Você deve omitir a linha se não quiser que o serviço seja iniciado automaticamente no momento da inicialização ou se esse serviço for parte de uma cadeia de dependências que você definiu explicitamente.

    Por exemplo, você pode estar refatorando o aplicativo de servidor A e, por algum motivo ou outro, decidir dividir alguma funcionalidade opcional dele em um serviço B separado, para permitir ao usuário a opção de não instalá-lo se não for necessário. Você pode então tornar o serviço B um separado service-B.rpme definir B.servicecom WantedBy=A.servicepara fazer systemdo serviço B inicializar automaticamente sempre que o serviço A for iniciado - mas somente quando service-B.rpmestiver realmente instalado.

    Observe que a Wantsou WantedByapenas diz que o sistema deve inicializar um serviço sempre que outro serviço ou destino também for iniciado, mas não especifica nada sobre a ordem de inicialização/desligamento. Se você precisar que o serviço B já esteja em execução quando o serviço A for inicializado, será necessário adicionar Before=A.serviceo B.servicearquivo para especificar explicitamente a dependência da ordem de inicialização.

    4.) Sempre que você quiser que o serviço tenha a capacidade de ser iniciado automaticamente no momento da inicialização, e não houver outras dependências já definidas.

    • 124
  2. sourcejedi
    2019-03-15T14:31:38+08:002019-03-15T14:31:38+08:00

    Se você remover WantedBy=multi-user.target, então systemctl enable your-example-here(ruidosamente) não fará nada.

    gráfico.destino

    Se você instalar o systemd puro a partir da origem, o "destino padrão" no qual ele inicializará será graphical.target.

    Iniciando graphical.targetinicia multi-user.target, mais qualquer unidade(s) necessária(s) para fornecer uma interface gráfica de usuário. Essa complexidade extra foi organizada em uma tentativa de emular "runlevels" herdados.

    Você realmente deve ignorar / ignorar a emulação "runlevel"; ele não funciona corretamente de qualquer maneira. Desculpe! Eu acho que a razão para enfatizar "gráfico" versus "multiusuário" historicamente é que o software gráfico é 1) não tão robusto e maduro quanto o resto do sistema e 2) requer muitos recursos.

    Normalmente, apenas algumas unidades são específicas para graphical.target. Existe um único serviço para a própria GUI, como gdm.target. Existem alguns serviços de suporte que são usados ​​principalmente pela GUI aqui também.

    Editar: A pesquisa no Google sugere que, se você não tiver uma GUI instalada, mas o "destino padrão" tiver sido deixado como graphical.target, o systemd poderá registrar um aviso. "Não é possível adicionar trabalho de dependência para unidade display-manager.service, ignorando: Unidade display-manager.service falhou ao carregar: Arquivo ou diretório inexistente." Queremos evitar sujar nossos logs com avisos desnecessários. Portanto, se você não instalou uma GUI, é bom usar o systemctl set-default multi-user. Embora o sistema de instalação do seu sistema operacional já tenha cuidado disso para você. Fora isso, sou fortemente a favor da apatia neste assunto :-).

    sysinit.target

    Alguns serviços e outros tipos de unidades estão "envolvidos na inicialização antecipada". Eles são definidos para iniciar Before=sysinit.target- direta ou indiretamente. A maioria dos serviços é iniciada apenas After=sysinit.target- esse é o caso automaticamente, a menos que o serviço defina DefaultDependencies=no.

    multiusuário.destino

    A maioria dos serviços de exemplo não se enquadra em nenhuma das categorias acima, portanto, os anexamos a multi-user.target. Isso inclui a maioria dos serviços de rede (por exemplo, um servidor web), que são o serviço de sistema arquetípico.

    serviços ativados dinamicamente

    Outra possibilidade que você pode ver é uma unidade de serviço que não é iniciada automaticamente na inicialização. Então não precisaria WantedBy=multi-user.target. O serviço pode ser acionado ou "ativado" por outra coisa.

    Um exemplo disso é um serviço ativado por dbus. O Dbus pode ser configurado para iniciar seu serviço sob demanda, quando uma chamada dbus é feita ao serviço.

    Para serviços de rede, você pode usar serviços ativados por soquete. Isso pode ser mais fácil de encontrar detalhes, porque toda a configuração está em unidades systemd. Por exemplo , sshd.socketou ssh.socketnormalmente está disponível para ativar [email protected]ou [email protected]. Embora eu ache mais comum iniciar o serviço sshd no momento da inicialização.


    Como sempre, o acima simplifica e omite detalhes que não pareciam ser necessários.

    • 9
  3. Jonathan Komar
    2020-05-27T23:47:35+08:002020-05-27T23:47:35+08:00

    O multi-user.targeté um nome semântico, ou seja, está associado a um significado. Permita-me demonstrar o conceito com um contra-exemplo. Vou argumentar que a decisão de usar multi-user.targetdepende do contexto.

    Se você criasse uma configuração de unidade de usuário systemd em vez de uma configuração de unidade de sistema , você poderia ingenuamente seguir as convenções das unidades de sistema systemd e usar multi-user.target1 .

    Explicação por Contra-Exemplo

    Considere o arquivo/home/jonathan/.config/systemd/user/coolstuff.service

    Esse usuário será usado apenas em relação a user jonathan, portanto, dificilmente faz sentido chamar meu destino de "multi-user.target".

    [Unit]
    Description=Does some cool stuff.
    
    [Service]
    ExecStart=/bin/bash -c '/usr/bin/echo "Cool stuff" >> %h/coolstuff.txt'
    
    [Install]
    WantedBy=user.target
    

    Observe como optei por usar WantedBy=user.target . Isso porque o escopo desse contexto é minha conta de usuário, portanto optei por usar minhas próprias convenções semânticas. Em outras palavras, vários usuários não serão afetados por esta unidade. No nível do sistema, no entanto, faz mais sentido seguir convenções padronizadas devido à sequência de inicialização paralela. Durante a inicialização, muitos procedimentos convergem em vários destinos. O multi-user.targetestá semanticamente associado à ideia de "ler para engajamento do usuário / interação com o sistema" (sem um sistema de janelas como o telcoM mencionado), portanto, é uma aposta segura para a maioria dos arquivos de unidade do sistema.

    Notas de rodapé

    1. Embora não fizesse sentido dentro desse contexto, ainda funcionaria.
    • 2

relate perguntas

  • Níveis diferenciadores no journalctl

  • Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _

  • systemd: como posso executar um script no início de um serviço, sem editar a definição do serviço

  • Use o suporte de watchdog do systemd para reiniciar o aplicativo

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

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