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 / 441087
Accepted
Guss
Guss
Asked: 2018-05-02 04:44:55 +0800 CST2018-05-02 04:44:55 +0800 CST 2018-05-02 04:44:55 +0800 CST

SystemD `Requires` falha quando a unidade necessária falha pela primeira vez

  • 772

Criei uma unidade SystemD para iniciar um serviço e esse serviço requer que outra unidade seja iniciada antecipadamente.

Eu configurei o serviço dependente com Requires=dependant.service, e dessa forma quando depending.serviceé iniciado automaticamente durante a inicialização, ele primeiro tenta iniciar dependant.service.

O problema é que, se dependant.servicecomeçar muito cedo, falha ao iniciar (não tenho certeza do que significa "muito cedo" aqui). Para resolver isso, configurei dependant.servicepara Restart=always.

E isso funciona bem - depending.serviceestá habilitado e inicia automaticamente, inicia dependant.service, que trava e depois é reiniciado e sempre consegue iniciar na 2ª tentativa.

Mas depending.servicevi dependant.servicea primeira falha do 's e suas Requires=dependant.servicecausas para falhar. O registro mostra:

systemd[1]: Dependency failed for depending.
systemd[1]: Job depending.service/start failed with result 'dependency'.

Mesmo que dependanteventualmente tenha sucesso, e ambos tenham Restart=always, dependingnunca reinicia após a falha inicial de dependant.

Eu tentei várias configurações de Requires=, e Wants=, mas não consegui encontrar uma combinação que causasse a reinicialização após a reinicialização.BindsTo=Afterdependingdependant

systemd services
  • 2 2 respostas
  • 1881 Views

2 respostas

  • Voted
  1. Best Answer
    ErikF
    2018-05-02T11:48:09+08:002018-05-02T11:48:09+08:00

    Parece que a causa raiz é que dependant.serviceàs vezes está começando cedo demais: adicionar Restartdiretivas é um pouco complicado. Isso para mim indica que está faltando um requisito de tempo, Afterpara o que serve. Dependendo do tipo de serviço, você precisará determinar quais recursos são necessários antes de iniciar o serviço.

    Supondo que isso esteja relacionado à rede, você desejará adicionar o seguinte na [Unit]seção de dependant.service:

    After=network.target
    

    Ao fazer isso, você está indicando que a rede básica deve estar disponível antes que o systemd tente iniciar o serviço. Caso contrário, o systemd tentará iniciar o máximo de serviços em paralelo possível, o que significa que, dependendo da ordem de início, você pode iniciar basicamente sem nada inicializado, que é uma situação que alguns serviços podem tolerar e outros falham muito.

    Se você quiser ter certeza de que depending.servicesempre reinicia com dependant.service, adicione um BindsToe Aftera depending.service:

    [Unit]
    After=dependant.service
    BindsTo=dependant.service
    

    Esses comportamentos são documentados na systemd.unit(7)página de manual. Raramente preciso usar mais de Wants, Requirese After, mas há opções mais avançadas se você tiver serviços com condições de inicialização particularmente complexas.

    Acho útil, ao criar um novo serviço (ou grupo de serviços), examinar os arquivos da unidade fornecidos pela distribuição para ver como eles são feitos e copiar descaradamente as partes boas (tente /usr/lib/systemd/systemou /lib/systemd/system): eles geralmente têm pistas sobre o que Aftere Requiresos requisitos são úteis para um determinado tipo de serviço.

    • 2
  2. tatraian
    2019-09-26T03:26:47+08:002019-09-26T03:26:47+08:00

    Para mim BindsTonão ajuda. Isso é (eu acho), porque BindsTosignifica que a unidade dependente não pode ser executada sem a unidade dependente. Mas nesta situação o processo dependente não foi iniciado porque a unidade dependente falhou ao iniciar pela primeira vez.

    Mas, de acordo com a documentação da unidade systemd, PartOf propaga o evento após cada reinicialização. Então isso funcionou para mim:

    [Unit]
    After=dependant.service
    PartOf=dependant.service
    
    • 1

relate perguntas

  • 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

  • resultados inesperados de `service | grep`

  • 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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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