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 / 729369
Accepted
Arkaik
Arkaik
Asked: 2022-12-23 12:13:03 +0800 CST2022-12-23 12:13:03 +0800 CST 2022-12-23 12:13:03 +0800 CST

Service OnFailure acionado somente após o limite de rajada atingido

  • 772

Estou usando um arquivo de unidade systemd para controlar um processo python em execução em um servidor (com systemd v247).

Este processo deve ser reiniciado 60 segundos após sua saída, seja em caso de falha ou sucesso, exceto se falhar 5 vezes em 600 segundos.

Este arquivo de unidade vincula outro serviço para notificar falhas por e-mail.

/etc/systemd/system/python-test.service

[Unit]
After=network.target
OnFailure=mailer@%n.service

[Service]
Type=simple

ExecStart=/home/debian/tmp.py

# Any exit status different than 0 is considered as an error
SuccessExitStatus=0

StandardOutput=append:/var/log/python-test.log
StandardError=append:/var/log/python-test.log

# Always restart service 60sec after exit
Restart=always
RestartSec=60

# Stop restarting service after 5 consecutive fail in 600sec interval
StartLimitInterval=600
StartLimitBurst=5

[Install]
WantedBy=multi-user.target

/etc/systemd/system/[email protected]

[Unit]
After=network.target

[Service]
Type=oneshot

ExecStart=/home/debian/mailer.py --to "[email protected]" --subject "Systemd service %I failed" --message "A systemd service failed %I on %H"

[Install]
WantedBy=multi-user.target

O acionamento de OnFailurefuncionou muito bem durante o teste básico. No entanto, quando adicionei a seção a seguir ao arquivo da unidade, ela OnFailurefoi acionada apenas quando as 5 falhas consecutivas ocorreram.

StartLimitInterval=600
StartLimitBurst=5

Este não é o comportamento que eu gostaria, pois quero ser notificado sempre que o processo falhar, mesmo que o limite de burst ainda não tenha sido atingido.


Ao verificar o status do processo, a saída não é a mesma quando o limite de rajada não é atingido

● python-test.service
     Loaded: loaded (/etc/systemd/system/python-test.service; disabled; vendor preset: enabled)
     Active: activating (auto-restart) (Result: exit-code) since Thu 2022-12-22 19:51:23 UTC; 2s ago
    Process: 1421600 ExecStart=/home/debian/tmp.py (code=exited, status=1/FAILURE)
   Main PID: 1421600 (code=exited, status=1/FAILURE)
        CPU: 31ms

Dec 22 19:51:23 test-vps systemd[1]: python-test.service: Failed with result 'exit-code'.

Do que quando é

● python-test.service
     Loaded: loaded (/etc/systemd/system/python-test.service; disabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Thu 2022-12-22 19:52:02 UTC; 24s ago
    Process: 1421609 ExecStart=/home/debian/tmp.py (code=exited, status=1/FAILURE)
   Main PID: 1421609 (code=exited, status=1/FAILURE)
        CPU: 31ms

Dec 22 19:51:56 test-vps systemd[1]: python-test.service: Failed with result 'exit-code'.
Dec 22 19:52:02 test-vps systemd[1]: python-test.service: Scheduled restart job, restart counter is at 5.
Dec 22 19:52:02 test-vps systemd[1]: Stopped python-test.service.
Dec 22 19:52:02 test-vps systemd[1]: python-test.service: Start request repeated too quickly.
Dec 22 19:52:02 test-vps systemd[1]: python-test.service: Failed with result 'exit-code'.
Dec 22 19:52:02 test-vps systemd[1]: Failed to start python-test.service.
Dec 22 19:52:02 test-vps systemd[1]: python-test.service: Triggering OnFailure= dependencies.

Não consegui encontrar nada explicando como modificar o acionamento de OnFailuredentro do arquivo da unidade.

Existe uma maneira de notificar os e-mails sempre que o processo falhar e ainda manter o limite de rajada?

linux
  • 1 1 respostas
  • 56 Views

1 respostas

  • Voted
  1. Best Answer
    Edgar Magallon
    2022-12-24T19:23:37+08:002022-12-24T19:23:37+08:00

    Há várias coisas que você deve fazer para trabalhar com o serviço do sistema como deseja (as alterações estão em /etc/systemd/system/python-test.service ).

    1. Mudar Restart=alwaysparaRestart=on-failure
    2. Os valores StartLimitInterval=600, StartLimitBurst=5parecem ser suportados ainda. No entanto, você deve colocá-los em [Unit]. Se você colocar StartLimitInterval, [Unit]você pode renomeá-lo para StartLimitIntervalSec( man systemd.unitusa StartLimitIntervalSecem vez disso).
    3. Adicionar RemainAfterExit=nona [Service]seção.
    4. Adicione esta linha na [Service]seção:TimeoutStopSec=infinity
    5. Use a variável de ambiente EXIT_STATUSno script para determinar se o script foi encerrado com êxito ou não.
    6. Mude OnFailure=mailer@%n.servicepara OnFailure=mailer@%N.service. A diferença entre ambos é que o uso %Nremoverá o sufixo.
    7. Instale e inicie o serviço atd( sudo systemctl start atd.service) para poder usar ato comando. Ou, se você não quiser usar at, poderá escrever outro serviço systemd para reiniciar o serviço. (neste exemplo, eu usei relaunch.service)
    8. Use os mesmos valores em sleepe RestartSec. No seu caso, pois RestartSectem 60então nessa linha o sleep deve ter 60também:
     echo "sleep 60; sudo systemctl start ${1}.service" | at now
    
    1. Usando ExecStarte ExecStopPost=para obter o ExitStatus do seu processo principal: /home/debian/tmp.py. Não use ExecStop,de man systemd.service:

    ExecStop=

    Observe que os comandos especificados em ExecStop= são executados apenas quando o serviço é iniciado com êxito primeiro. Eles não são invocados se o serviço nunca foi iniciado ou em caso de falha na inicialização, por exemplo, porque qualquer um dos comandos especificados em ExecStart=, ExecStartPre= ou ExecStartPost= falhou (e não foi prefixado com "-" , veja acima) ou expirou. Use ExecStopPost= para invocar comandos quando um serviço falha ao iniciar corretamente e é encerrado novamente.


    O serviço /etc/systemd/system/python-test.service deve ser:

    [Unit]
    After=network.target
    OnFailure=mailer@%N.service
    
    StartLimitBurst=5
    StartLimitIntervalSec=600
     
    [Service]  
    Type=simple 
    TimeoutStopSec=infinity
    ExecStart=/home/debian/tmp.py
    ExecStopPost=/bin/bash -c 'echo The Service  has exited with values: $$EXIT_STATUS,$$SERVICE_RESULT,$$EXIT_CODE'
    ExecStopPost=/home/debian/bin/checkSuccess "%N"
    # Any exit status different than 0 is considered as an error
    SuccessExitStatus=0
    StandardOutput=append:/tmp/python-out-test.log
    StandardError=append:/tmp/python-err-test.log
    # Always restart service 60sec after exit
    Restart=on-failure
    RestartSec=60
    RemainAfterExit=no
    
    [Install]
    WantedBy=multi-user.target
    

    E /home/debian/bin/checkSuccess deve ter isto:

    Solução 1: Usando ato comando:

    #!/bin/bash
    
    if [ "$EXIT_STATUS" -eq 0 ]
    then
       echo "sleep 60; sudo systemctl start ${1}.service" | at now
       exit 0
    else
       systemctl start "mailer@${1}.service"
       exit 0
    fi
    

    Solução 2: Usando outro serviço systemd:

    #!/bin/bash
    
    if [ "$EXIT_STATUS" -eq 0 ]
    then
       systemctl start relaunch.service
    else
       systemctl start "mailer@${1}.service"
    fi
    exit 0
    

    E o relaunch.servicedeve ter:

    [Unit]
    Description=Relaunch Python Test Service
    
    [Service]
    Type=simple
    RemainAfterExit=no 
    ExecStart=/bin/bash -c 'echo Delay; sleep 10 ; systemctl start python-test.service'
    

    A "$EXIT_STATUS"variável definida pelo serviço systemd é determinada pelo status de saída de /home/debian/tmp.py.

    O ${1}representa o nome da unidade: python-teste é passado para o script na linha /home/debian/bin/checkSuccess "%N".


    Notas:

    1. Você pode verificar os logs: 'echo The Service %n has exited with values: $$EXIT_STATUS,$$SERVICE_RESULT,$$EXIT_CODE' em tempo real usando:
    tail -f /tmp/python-out-test.log
    
    1. Se você usar a solução 2 ( com relaunch.service) quando quiser interromper seu serviço principal, execute:
    sudo systemctl stop relaunch.service
    #Might not be necessary but you stop python service too:
    # sudo systemctl stop python-test.service
    
    • 1

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • 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