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 OnFailure
funcionou muito bem durante o teste básico. No entanto, quando adicionei a seção a seguir ao arquivo da unidade, ela OnFailure
foi 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 OnFailure
dentro do arquivo da unidade.
Existe uma maneira de notificar os e-mails sempre que o processo falhar e ainda manter o limite de rajada?